我发现以下代码编译和工作:
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)
Run Code Online (Sandbox Code Playgroud)
这打印E4BB8AE697A5,这是一个有效的UTF8表示??
据我所知,这是无证行为.来自文件:
当函数声明为采用UnsafePointer参数时,它可以接受以下任何一种:
- nil,作为空指针传递
- UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时转换为UnsafePointer
- 一个输入输出表达式,其操作数是类型为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>'
Run Code Online (Sandbox Code Playgroud)
即使内部String表示是UTF16
let str = "??" …Run Code Online (Sandbox Code Playgroud) swift ×1