我發(fā)現(xiàn)以下代碼可以編譯并運(yùn)行: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的有效表示形式今日據(jù)我所知,這是未記錄的行為。從文檔中:當(dāng)一個(gè)函數(shù)被聲明為帶有UnsafePointer參數(shù)時(shí),它可以接受以下任何一個(gè):nil,作為空指針傳遞UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要時(shí)將其轉(zhuǎn)換為UnsafePointer一個(gè)In-out表達(dá)式,其操作數(shù)是Type類型的左值,作為左值的地址傳遞一個(gè)[Type]值,作為指向數(shù)組開頭的指針傳遞,并在調(diào)用期間進(jìn)行生命周期擴(kuò)展在這種情況下,str不是他們。我想念什么嗎?添加:如果參數(shù)類型是 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>'即使內(nèi)部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>函數(shù)參數(shù)行為的字符串值
ibeautiful
2019-10-21 15:48:55