在swift中的不同UnsafePointer <T>之间进行转换

Ale*_*ßen 23 macos ios swift

我试图从快速使用C-Api.作为一个例子,C-Api采用这种方式:

void doThingsOnRawData(const unsigned char* data);
Run Code Online (Sandbox Code Playgroud)

Swift将其转换为:

void doThingsOnRawData(UnsafePointer<UInt8>);
Run Code Online (Sandbox Code Playgroud)

现在我想将数据从NSData传递给函数.NSData.byte返回类型:

UnsafePointer<()>
Run Code Online (Sandbox Code Playgroud)
  1. 这是某种无效*类型吗?

  2. 至少swift不接受它作为一个UnsafePointer<UInt8>.我该怎么办呢?

Mar*_*n R 36

struct UnsafePointer<T> 有一个构造函数

/// Convert from a UnsafePointer of a different type.
///
/// This is a fundamentally unsafe conversion.
init<U>(_ from: UnsafePointer<U>)
Run Code Online (Sandbox Code Playgroud)

你可以在这里使用

doThingsOnRawData(UnsafePointer<UInt8>(data.bytes))
Run Code Online (Sandbox Code Playgroud)

您甚至可以省略泛型类型,因为它是从上下文中推断出来的:

doThingsOnRawData(UnsafePointer(data.bytes))
Run Code Online (Sandbox Code Playgroud)

Swift 3的更新:从Xcode 8 beta 6开始,你不能再直接在不同的不安全指针之间进行转换.

data: NSData,data.bytes是一种UnsafeRawPointer可被转化到UnsafePointer<UInt8>assumingMemoryBound:

doThingsOnRawData(data.bytes.assumingMemoryBound(to: UInt8.self))
Run Code Online (Sandbox Code Playgroud)

因为data: Data它更简单:

data.withUnsafeBytes { doThingsOnRawData($0) }
Run Code Online (Sandbox Code Playgroud)