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

标签 ios macos swift

我正在尝试使用 swift 中的 C-Api。例如,C-Api 是这样的:

void doThingsOnRawData(const unsigned char* data);

Swift 将其转换为:

void doThingsOnRawData(UnsafePointer<UInt8>);

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

UnsafePointer<()>
  1. 这是某种 void* 类型吗?

  2. 至少 swift 不会接受它作为 UnsafePointer<UInt8> .我该怎么做才能转换这个?

最佳答案

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

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

你可以在这里使用

doThingsOnRawData(UnsafePointer<UInt8>(data.bytes))

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

doThingsOnRawData(UnsafePointer(data.bytes))

Swift 3 更新:从 Xcode 8 beta 6 开始,您无法转换 不再直接在不同的不安全指针之间。

对于 data: NSData , data.bytesUnsafeRawPointer哪个行 转换为 UnsafePointer<UInt8>assumingMemoryBound :

doThingsOnRawData(data.bytes.assumingMemoryBound(to: UInt8.self))

对于 data: Data它甚至更简单:

data.withUnsafeBytes { doThingsOnRawData($0) }

关于ios - swift 在不同的 UnsafePointer<T> 之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359735/

相关文章:

swift - XC测试 : how can we inject a class at runtime

ios - 在 Interface Builder 中反射(reflect) UIView 层属性的变化

ios - 如何在运行时每 0.2 秒在屏幕上的不同位置重新创建屏幕上的相同节点?

node.js - 我们的时间追踪器如何绕过 MacOS 辅助功能设置?

debugging - 反编译 DyLib(动态库)

ios - 将 MultipeerConnectivity Framework 与 WiFly 模型一起使用?

swift - 方法不会为 Set<NSObject> 覆盖其父类(super class)中的任何方法

ios - 尝试在没有 ViewController 的情况下使用 CollectionViewController 时出错

ios - UIScrollView 中的 UIView 尊重一些约束,但不尊重其他约束

ios - Swift 2.1 词典扩展