我正在通过链接的 header 从我的 swift viewController 调用 .mm (objective-c/c++) 类方法。他们已成功链接。但是,我正在努力传递与参数匹配的正确数据类型。 这是我在 swift 中调用函数的地方
OpenCVWrapper.thefunc(array1, otherstuff);
...array1
的类型为 [[Int]]
这是objective-c中的定义
+(NSString*) thefunc: (int[][2])array1 otherstuff(int)other{
但是我得到了错误
Cannot convert value of type '[[Int]]' to expected argument type 'UnsafeMutablepointer<(Int32)(Int32)>!'
我的问题是,我如何匹配数据类型,以便它们都能处理 Int 类型的基本二维数组?
更新:
值(value)/结构问题:
从 swift 传递的结构:
在 OC 中接收到的结构:
最佳答案
首先,你可能需要知道 C 数组和 Swift Array
是不同的东西。 C 数组表示连续的内存区域,并在传递时使用指向第一个元素的指针。
其次,如果你想使用从 Swift 导入的 Objective-C 方法,你最好检查方法生成的头文件。
(当编辑器显示 .h 文件时,按下“四方形图标”并选择“生成的界面”。)
用一个小示例项目测试,您的方法被导入为:
open class func thefunc(_ array1: UnsafeMutablePointer<(Int32, Int32)>!, otherstuff other: Int32) -> String!
(int
在Swift中对应的类型是Int32
,不是Int
。)
因此,您可能需要将可变指针传递给元组 (Int32, Int32)
,为此您需要声明一个元素类型 的 Swift
并将其作为 inout 参数传递(使用 Array
>(Int32, Int32)&
)。
所以,你可能需要这样写:
//Assuming all inner Array of `array1` have two elements.
var convertedArray = array1.map {(Int32($0[0]), Int32($0[1]))}
MyClass.thefunc(&convertedArray, otherstuff: someInt32Value)
但是大数组的转换可能需要一些时间,在某些情况下,这是很关键的。
您可以将您的 Swift 端 array1
声明为 (Int32, Int32)
的 Array
并根据此更改修改其他部分,并使用它是:
//Somewhere in your code...
var array1: [(Int32, Int32)] = []
//...
//And call `thefunc` as:
MyClass.thefunc(&array1, otherstuff: someInt32Value)
关于ios - 如何匹配 swift 和 objective-c 之间的二维数组数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581508/