2014-11-21 3 views
10

나는 다음과 같은 코드는 컴파일 발견하고 작동합니다문자열 값은

func foo(p:UnsafePointer<UInt8>) { 
    var p = p 
    for p; p.memory != 0; p++ { 
     print(String(format:"%2X", p.memory)) 
    } 
} 

let str:String = "今日" 
foo(str) 

E4BB8AE697A5 인쇄하고는 지금까지 내가이 알고있는 今日

의 유효한 UTF8 표현입니다 문서화되지 않은 행동입니다. , 널 포인터

  • UnsafePointer, UnsafeMutablePointer로 전달

    • 무기 호 : 함수가 UnsafePointer 인수를 고려로 선언 the document:

      에서, 다음 중 하나를 받아 들일 수 또는 AutoreleasingUnsafeMutablePointer 값 (필요한 경우 UnsafePointer로 변환 됨)

    • 피연산자가 유형 값의 lvalue이고 lvalue의 주소로 전달되는 in-out 표현식
    • 상기 어레이의 시작에 대한 포인터 등의 전달 63,210
    • A [형태] 값 str 그들의 비이며,이 경우에는 통화

    기간 동안 수명 - 연장.

    나는 뭔가를 놓친가요?


    ADDED :

    그리고 내부 String 표현은 UTF16

    let str = "今日" 
    var p = UnsafePointer<UInt16>(str._core._baseAddress) 
    for p; p.memory != 0; p++ { 
        print(String(format:"%4X", p.memory)) // prints 4ECA65E5 which is UTF16 今日 
    } 
    
  • +0

    마지막 하나 인 것 같습니다. – Mundi

    +0

    나는 생각한다.'String'은'Array ' – rintaro

    +0

    이 아니며 두 번째부터 말하려고합니다. 이것은 in-out 변수와 같습니다. 어쩌면 ** "통과 한"** 표현이 명확하지 않을 수도 있습니다. 이것은 "이 함수가이 인수를 해석하는 방법"("나는 생각한다") 또는 "이것은 당신이 전달해야하는 것"을 의미 할 수 있습니다. – Mundi

    답변

    7

    이를 비록 매개 변수 유형은 UnsafePointer<UInt16>

    func foo(p:UnsafePointer<UInt16>) { 
        var p = p 
        for p; p.memory != 0; p++ { 
         print(String(format:"%4X", p.memory)) 
        } 
    } 
    let str:String = "今日" 
    foo(str) 
    //^'String' is not convertible to 'UnsafePointer<UInt16>' 
    

    경우 작동하지 않습니다 일하고있다 becaus e 팀이 처음 출시 된 이래로 만든 상호 운용성 변화 중 하나입니다. 아직 문서화되지 않은 것처럼 보입니다. String은 많은 추가 작업없이 const char * 매개 변수를 예상하는 C 함수를 호출 할 수 있도록 UnsafePointer<UInt8>이 필요한 곳에서 작동합니다.

    는 "shims.h"에 정의 된 C 함수 strlen에서

    봐는 : 스위프트에서

    size_t strlen(const char *s); 
    

    는이 같은 통해 제공 : 더와 String 호출 할 수 없습니다

    func strlen(s: UnsafePointer<Int8>) -> UInt 
    

    추가 작업 :

    h를 보려면이 답변의 개정판을보십시오. ow C 문자열 interop이 시간이 지남에 따라 변경되었습니다. https://stackoverflow.com/a/24438698/59541

    +0

    감사합니다. 좋은. 'swiftc -emit-sil' 결과에 따르면, 실제로'String.UTF8View.Generator'에서 임시로'Array '을 생성합니다. 그것은 그렇게 빨리 보이지 않습니다. ... – rintaro

    +0

    허. 음, SIL의 "I"는 중급을 의미합니다. 맞습니까? 컴파일 된 런타임에서 문자열을 실제로 구현하는 방법에 따라 (실제로 두 x 호가'char *'이면?), 이는 작동하지 않을 수 있습니다. –