从UnsafeBufferPointer到UnsafeRawBufferPointer的隐式转换

时间:2017-10-09 17:07:08

标签: swift unsafe-pointers

作为参数传递时,

UnsafeRawPointers can be implicitly castvar 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;

为什么在允许前一个隐式转换时不可能进行隐式转换?

1 个答案:

答案 0 :(得分:3)

你不能施放 UnsafeBufferPointerUnsafeRawBufferPointer 因为这不仅仅是重新解释指针:它需要 计算原始字节数。

但您可以<{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)
}