我發現下面的代碼編譯和工作原理:字符串值UnsafePointer <UInt8>功能參數的行爲
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表示,據我所知,這是無證的行爲。從the document:
當一個函數被聲明爲接受一個UnsafePointer參數,它可以接受任何以下的:
- 零,這是作爲一個空指針
- 一種UnsafePointer,UnsafeMutablePointer通過,或AutoreleasingUnsafeMutablePointer值,必要時將其轉換爲UnsafePointer
- 一個輸入表達式,其操作數類型爲Type的左值,該值作爲左值的地址傳遞
- A [類型]值,其作爲一個指針數組的開始,並通過壽命延長的用於呼叫
的持續時間在此情況下,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
表示是UTF-16
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 今日
}
它似乎是最後一個,不是? – Mundi 2014-11-21 14:30:29
我認爲,沒有。'String'不是'Array' –
rintaro
2014-11-21 14:32:43
我打算說倒數第二個。它就像一個輸入變量。或許「通過」**的措詞不清楚。這可能意味着「這是函數如何解釋這個論點」(我認爲是這個意思),或者「這就是你必須通過的」(我認爲這裏不是這個意思)。 – Mundi 2014-11-21 14:35:58