我發現以下代碼可以編譯并運行: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參數時,它可以接受以下任何一個:nil,作為空指針傳遞UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要時將其轉換為UnsafePointer一個In-out表達式,其操作數是Type類型的左值,作為左值的地址傳遞一個[Type]值,作為指向數組開頭的指針傳遞,并在調用期間進行生命周期擴展在這種情況下,str不是他們。我想念什么嗎?添加:如果參數類型是 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>'即使內部String表示形式為UTF16let 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 今日}
UnsafePointer <UInt8>函數參數行為的字符串值
ibeautiful
2019-10-21 15:48:55