在Swift中与指向Int数组的C指针进行互操作
我有一个具有此功能的遗留代码库:在Swift中与指向Int数组的C指针进行互操作,swift,Swift,我有一个具有此功能的遗留代码库: -(void)foo: (int *)buffer { myArray[0] = buffer[0]; myArray[1] = buffer[1]; myArray[2] = buffer[2]; myArray[3] = buffer[3]; } 在Swift中,该方法编写如下: func foo(buffer: UnsafeMutablePointer<Int32>) { } guard let buffer = buffe
-(void)foo: (int *)buffer {
myArray[0] = buffer[0];
myArray[1] = buffer[1];
myArray[2] = buffer[2];
myArray[3] = buffer[3];
}
在Swift中,该方法编写如下:
func foo(buffer: UnsafeMutablePointer<Int32>) {
}
guard let buffer = buffer.memory as? [Int] else { fatalError() }
guard let buffer = buffer as? [Int] else { fatalError() }
guard let buffer = buffer.memory as? [Int32] else { fatalError() }
guard let buffer = buffer as? [Int32] else { fatalError() }
出于绝望,即使知道unsafemeutablepointer
最终在Swift中被解析为Int32
类型,我也尝试了以下方法:
func foo(buffer: UnsafeMutablePointer<Int32>) {
}
guard let buffer = buffer.memory as? [Int] else { fatalError() }
guard let buffer = buffer as? [Int] else { fatalError() }
guard let buffer = buffer.memory as? [Int32] else { fatalError() }
guard let buffer = buffer as? [Int32] else { fatalError() }
有人能给我指出正确的方向,让我了解如何像Objective-C代码那样访问下标成员吗?也许你可以改为使用
UnsafeBufferPointer
旨在为内存中的单个位置建模。要处理缓冲区,请使用
UnsafeBufferPointer
可以像数组一样被订阅,并进行绑定检查(因为它需要您为它指定一个计数
)
您甚至不必像在目标C代码中那样进行手动转换,您可以直接从UnsafeBufferPointer
初始化Array
,非常容易:
func foo(buffer: UnsafeMutablePointer<Int32>) {
myArray = Array(UnsafeBufferPointer(start: pointer, count: 4))
}
func-foo(缓冲区:UnsafeMutablePointer){
myArray=Array(非安全缓冲指针(开始:指针,计数:4))
}
此解决方案甚至是通用的:UnsafeBufferPointer
可以从您提供的UnsafePointer
推断其类型,并将该信息传递给数组
,使其自动创建[Int32]
注意:记住取消分配未安全指针 你想得太多了:
class MyClass {
var myArray = [Int32](count: 4, repeatedValue: 0)
func foo(buffer: UnsafeMutablePointer<Int32>) {
for i in 0..<4 {
myArray[i] = buffer[i]
}
}
}
谢谢,我想得太多了;为了将来参考其他人,UnsafeMutablePointer
允许订阅。作为旁注,我很好奇为什么guard let buffer=buffer.memory As?[Int32]否则{fatalError()}
将失败。有什么想法吗?memory
指向数组的第一个元素,而不是数组本身,因此不可强制转换guard let buffer=buffer as如何?[Int32]否则{…}
?没有意识到不可分配指针
是可下标的,这很好。一般来说,我不喜欢这种方法,因为有一种更干净、内置的方法可以做到这一点,谢谢。非常酷的方法。我证实了这一点。请问您是否知道一种方法可以安全地找到不可分配指针的计数
?不,这太“低级”了。unsafemeutablepointer
只知道地址和类型。它无法知道长度,这就是为什么你必须提供它。如果处理的是C字符串,则可以迭代查找第一个NUL
字符。除此之外,没有办法知道您可能可以从提供指针的任何源获取长度。相关:。