2014-10-29 2 views
1

Swift에서 Objective-C 메서드를 호출하려고하는데 해결 방법을 모르는 오류가 하나 있습니다.Objective-C 메서드를 호출 할 때 Swift에서 NilLiteralConversion 오류가 발생했습니다.

self.clisitef.IniciaFuncaoSiTefInterativo(modalidade, pValor: self.amount, pNumeroCupomFiscal: numeroCupom, pDataFiscal: dateFormated, pHorario: timeFormated, pOperador: self.userOperator, pRestricoes: nil) 

마지막 인수 "pRestricoes"는 nil을 허용하지 않습니다.

IniciaFuncaoSiTefInterativo (int Modalidade, char *pValor, 
                char *pNumeroCuponFiscal, 
                char *pDataFiscal, char *pHorario, 
                char *pOperador, char *pRestricoes); 

너희들이 좀 도와 줄래 : 그것은 목표 - C의 방법은, 내가 잘못이 무엇인지 이해할 수 없다보고 오류

Cannot convert expressions type... NilLiteralConversion 

을 트리거? 정말 고마워 !

모든 올바른 인수 Objetive-C에서 같은 전화 :

[_clisitef IniciaFuncaoSiTefInterativo: Modalidade pValor:@"1000" 
pNumeroCupomFiscal:_trnCupom pDataFiscal:_trnData 
pHorario:_trnHora pOperador:@"Teste" pRestricoes:nil]; 
+0

마지막 호출 할 메소드가 nil일까요? 또는 다른 것? – zaph

+0

@Zaph 예, 마지막 인수에 nil을 설정하려고합니다. 나는 빈 문자열을 사용하여 "nil"을 시도했으며, 항상 같은 오류가 발생했습니다. –

+0

@DiegoCharles :'pOperador : @ "Teste"라는 인수를 호출하는 것이 Objective-C 작업에서 어떻게 작동하는지 궁금합니다. 매개 변수의 타입은'char *'이고 당신은'NSString'으로 호출하고 있습니다. –

답변

1

그 오류 메시지가 매우 잘못된합니다 - nil가 바로 호출의 유일한 인수입니다! 이 같은 스위프트에있어서,지도 :

IniciaFuncaoSiTefInterativo(Modalidade: Int32, pValor: UnsafeMutablePointer<Int8>, 
    pNumeroCuponFiscal: UnsafeMutablePointer<Int8>, pDataFiscal: UnsafeMutablePointer<Int8>, 
    pHorario: UnsafeMutablePointer<Int8>, pOperador: UnsafeMutablePointer<Int8>, 
    pRestricoes: UnsafeMutablePointer<Int8>) 

당신은 당신이 보내는 첫 번째 매개 변수가 쉽지 인 Int32, 있는지 확인해야합니다

self.clisitef.IniciaFuncaoSiTefInterativo(Int32(modalidade), ...) 

하지만 나머지가 있기 때문에, 까다 롭습니다 Swift String에서 UnsafeMutablePointer<Int8>을 얻을 수있는 아주 간단한 방법은 아닙니다. (나머지 인수가 무엇인지 추측합니다.) 그러나 UnsafeMutablePointer<T>이 필요한 곳에 T 배열을 전달할 수 있으므로 문자열을 [Int8]으로 변환 해 봅시다. 함수를 사용하여 잡담을 숨기고 호출이 너무 나쁘지 않아도됩니다.

func toCharArray(string: String) -> [Int8] { 
    return string.withCString { cString in 
     var chars: [Int8] = [] 
     var i = 0 
     do { 
      chars.append(cString[i]) 
     } while cString[i++] != 0 
     return chars 
    } 
} 

self.clisitef.IniciaFuncaoSiTefInterativo(Int32(modalidade), 
    pValor: toCharArray(self.amount), 
    pNumeroCupomFiscal: toCharArray(numeroCupom), 
    pDataFiscal: toCharArray(dateFormated), 
    pHorario: toCharArray(timeFormated), 
    pOperador: toCharArray(self.userOperator), 
    pRestricoes: nil) 
+1

'func mutableCString (string : String) -> UnsafeMutablePointer {return string.withCString() {UnsafeMutablePointer ($ 0)}}'도 작동하고 "스위프트 전용"이어야합니다. - 그러나 어쨌든 문자열은 실제로 변경할 수 없으므로 포인터를 통해 문자열을 수정하면 충돌이 발생할 수 있습니다. 가능한 경우, C 함수는'const char *'매개 변수를 취하는 것으로 선언되어야합니다. 이것들은 (정확하게 기억한다면)'UnsafePointer '으로 매핑됩니다. –

+0

그래, 나는 그것을 밖으로 시도하고, 충돌하지 않는 동안, 그것은 장관적으로 실패합니다. '.withCString()'은 클로저의 길이만큼 포인터가 계속 움직일 것임을 보장하기 때문에 리턴되는 것은'UnsafeMutablePointer'입니다. 나는 새로운'UnsafeMutablePointer'를 만들고 그것으로 문자를 복사하는 것이 Swift-native 버전 일 것이라고 생각합니다. –

+0

'mutableCString()'은 필자의 답처럼 작동한다. - 유일한 가변 포인터를 반환한다. –

관련 문제