2016-09-19 54 views
1

我从我的swift viewController通过链接头调用.mm(objective-c/C++)类方法。他们已成功链接。但是,我正在努力传递与参数匹配的正确数据类型。 这里就是我称之为迅速如何在swift和objective-c之间匹配2d数组数据类型?

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类型的基本2D数组?

UPDATE:

值/结构的问题:

结构从迅速传递:在OC接收

enter image description here

结构:

enter image description here

回答

1

首先,您可能需要知道C-array和Swift Array是不同的东西。 C数组表示一个连续的内存区域,并在传递时使用指针作为第一个元素。其次,如果要使用Swift导入的Objective-C方法,最好检查方法的生成头。

(按“四个方形图标”,然后选择“生成的接口”,而编辑器显示.h文件)

一个小样本项目测试,你的方法导入为:

open class func thefunc(_ array1: UnsafeMutablePointer<(Int32, Int32)>!, otherstuff other: Int32) -> String! 

(斯威夫特相应类型intInt32,不Int。)

所以,你可能需要通过一个可变的指针元组(Int32, Int32),要做到这一点,你需要声明元素类型(Int32, Int32)的Swift Array并将其作为inout参数传入(使用&)。

所以,你可能需要编写这样的事:

//Assuming all inner Array of `array1` have two elements. 
var convertedArray = array1.map {(Int32($0[0]), Int32($0[1]))} 
MyClass.thefunc(&convertedArray, otherstuff: someInt32Value) 

但巨大的数组的转换可能需要一定的时间,在某些情况下,这是至关重要的。

你可以宣布你的雨燕侧array1(Int32, Int32)Array和修改根据此变化的其他部分,并把它作为:

//Somewhere in your code... 
var array1: [(Int32, Int32)] = [] 

//... 

//And call `thefunc` as: 
MyClass.thefunc(&array1, otherstuff: someInt32Value) 
+0

真正体会到了深入的答案,我会尝试明天吧 - 会回复你。干杯。 –

+0

现在就开始工作。为什么'[(Int32,Int32)]'而不是'[[Int32]]'?欢呼声 –

+0

@harrylakins,正如我写的,C阵列是一个连续的记忆区域。但在Swift中,'[Int32]'实际上是一个包含对作为可变大小数组的对象的间接引用的结构体。内存表示是完全不同的。因此,Swift将固定大小的C数组作为Swift元组,将每个元素放在一个连续的区域中。 – OOPer