在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
字符。除此之外,没有办法知道您可能可以从提供指针的任何源获取长度。相关:。