ios - 如何匹配 swift 和 objective-c 之间的二维数组数据类型?

标签 ios objective-c swift

我正在通过链接的 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 传递的结构:

enter image description here

在 OC 中接收到的结构:

enter image description here

最佳答案

首先,你可能需要知道 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 Array >(Int32, Int32) 并将其作为 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)

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

您可以将您的 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/

相关文章:

ios - 将日期转换为设备时区

ios - 点击时使 UIButton 文本变暗

java - 如何使用 libGDX 编写 iOS 后端(游戏中心、IAP 等)?

ios - 从通知打开应用程序时显示特定选项卡

swift - 避免 Equatable 和 Hashable 样板,Swift 4.2

ios - 为什么上面的语句没有被先执行

ios - 生成新的 UITableViewController 并显示它

ios - NSPredicate 仅返回与一对多关系中的其他实体相连的实体

Swift:将类型 T 的数组传递给采用 T 协议(protocol)数组的方法

php - iOS/PHP : communicating with database