2016-12-23 13 views
3

으로 변환합니다. Swift에서 Swift 문자열로 변환 된 이전 C 라이브러리에 const char *를 전달하려고합니다. Swift 문자열에서 const char *

나는 C 함수 호출 해요되어

artnet_node artnet_new(const char *ip, int verbose) { ... 

가 어떻게이 const를 문자 유형으로 스위프트 문자열을 변환 할 수 있습니까?

internal var ipAddress = "192.168.1.43" 

을하지만, DIT는 내가 유형을 지정해야 내가하는 기능이 필요이

internal var ipAddress:String = "192.168.1.43" 

처럼 통과 할 때 작동하지 않습니다 :이 같은 IPADDRESS을 통과 할 때 그것은 작동

internal func setupArtnode(ip:String) -> Int{ 

String 대신 AnyObject를 사용해 보았지만 작동하지 않습니다.

감사합니다.

+0

작동하지 않는 컴파일, 실행 및 관련 오류 메시지에 대한 설명을 추가하십시오. – sbooth

답변

2

왜이 코드가 작동하는지 잘 모름. unsafePointer와 같은 것으로 보이는 const char *를 기대하는 C 함수에 문자열을 전달합니다.

internal func setupArtnode(ipAddress:String) -> NSInteger{ 
    let cString = self.ipAddress.cString(using: String.defaultCStringEncoding)! 
    let newString:String = NSString(bytes: cString, length: Int(ipAddress.characters.count), encoding:String.Encoding.ascii.rawValue)! as String 
    let key2Pointer = UnsafePointer<Int8>(newString) 

    node = artnet_new(key2Pointer, Int32(verbose))  // VERBOSE : true(1) , false(0) 
... 
0

스위프트 배열에 포함 된 것을 지정하지 않았습니다.

let str = "Hello world" 
let cArray = str.cString(using: .utf8) 

artnet_new(cArray, 1) 
+0

내가 잘못 입력해서 미안하다. 나는 하나의 문자열을 const char로 변경하려고한다. 어떤 이유로 함수가 인수를 취하지 않고 디폴트 값을 취하는 이유에 대해 –

3

당신은 const char *을 기대 C 함수에 직접 String을 통과 할 수 있어야하고 자동으로 null로 끝나는로 변환됩니다 : 어떤 경우에, 당신은 Int8의 배열에 스위프트 배열을 변환해야 UTF-8 문자열 :

자세한 내용은 Interacting with C APIs을 참조하십시오. 여기에 관련 발췌은 다음과 같습니다

  • 문자열 값을, 유형 INT8 또는 UINT8 경우 : 함수은 (는) 다음 중 하나를 수용 할 수있는 UnsafePointer 인수 을 복용으로 선언

    . 문자열은 버퍼에서 자동으로 UTF8로 변환되고 해당 버퍼에 대한 포인터가 함수에 전달됩니다.

+0

질문을 편집했다. info –

+0

귀하의 견적서가 작동하지 않는 UnsafePointer 을 사용하게했습니다. 제 작업 코드를 추가했습니다. 감사!! –