UnsafeRawPointers
can be implicitly cast到var x = 42
func print<T>(address p: UnsafeRawPointer, as type: T.Type) {
print(p.load(as: type))
}
withUnsafePointer(to: &x) { (ptr) in
print(address: ptr, as: Int.self) // Prints "42"
}
:
UnsafeBufferPointer
但是,似乎UnsafeRawBufferPointer
无法隐式转换为var x = 42
func printBuffer<T>(address p: UnsafeRawBufferPointer, as type: T.Type) {
print(p.load(as: type))
}
withUnsafePointer(to: &x) { (ptr) in
let buff = UnsafeBufferPointer(start: ptr, count: 1)
printBuffer(address: buff, as: Int.self) // 1
}
:
// 1
在此代码段中,标有create or replace function array_unique_elements(arr anyarray)
returns integer
language sql immutable
as $$
select count(distinct a)::int
from unnest(arr) a
$$;
错误的行:
无法转换类型&#39; UnsafeBufferPointer&#39;预期参数类型&#39; UnsafeRawBufferPointer&#39;
为什么在允许前一个隐式转换时不可能进行隐式转换?
答案 0 :(得分:3)
你不能施放 UnsafeBufferPointer
到UnsafeRawBufferPointer
因为这不仅仅是重新解释指针:它需要
计算原始字节数。
但您可以<{1}} 创建 UnsafeRawBufferPointer
:
UnsafeBufferPointer
以下是UnsafeRawBufferPointer.swift.gyb中初始值设定项的实现:
withUnsafePointer(to: &x) { (ptr) in
let buff = UnsafeBufferPointer(start: ptr, count: 1)
let rawBuff = UnsafeRawBufferPointer.init(buff)
printBuffer(address: rawBuff, as: Int.self)
}