Как сопоставить тип данных массива 2d между быстрым и объективным-c?

80
12

Я вызываю метод класса.mm(object-c/c++) из моего swift viewController через связанные заголовки. Они успешно связаны. Тем не менее, я изо всех сил пытаюсь передать правильные типы данных, которые соответствуют параметрам. Здесь я называю функцию быстрым

OpenCVWrapper.thefunc(array1, otherstuff);

.. .array1 имеет тип [[Int]]

и вот определение в объективе-c

+(NSString*) thefunc: (int[][2])array1 otherstuff(int)other{

но я получаю ошибку

Cannot convert value of type '[[Int]]' to expected argument type 'UnsafeMutablepointer<(Int32)(Int32)>!'

Мой вопрос в том, как я могу сопоставить типы данных, чтобы они обрабатывали базовый 2D-массив типа Int?

ОБНОВИТЬ:

проблемы с ценностью/структурой:

структура перешла от быстрой:

enter image description here

структура, полученная в OC:

enter image description here

спросил(а) 2021-01-19T18:27:33+03:00 9 месяцев назад
1
Решение
65

Прежде всего, вам может понадобиться знать, что C-массив и Swift Array - это разные вещи. C-массив представляет собой смежную область памяти и использует указатель на первый элемент при его передаче.

Во-вторых, если вы хотите использовать импортированный метод Objective-C из Swift, лучше проверить сгенерированный заголовок метода.

(Нажмите "четырехквадратный значок" и выберите "Сгенерированный интерфейс", в то время как редактор показывает файл.h).

Протестированный небольшим образцовым проектом, ваш метод импортируется как:

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

(Соответствующий тип int в Swift - Int32, а не Int.)

Таким образом, вам может потребоваться передать изменяемый указатель на tuple (Int32, Int32), чтобы сделать это, чтобы вам было объявлено тип Swift Array of Element (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)

Но преобразование огромного массива может занять некоторое время, в некоторых случаях, что является критическим.

Вы можете объявить свой Array Swift array1 как Array of (Int32, Int32) и изменить другие части в соответствии с этим изменением и использовать его как:

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

//...

//And call 'thefunc' as:
MyClass.thefunc(&array1, otherstuff: someInt32Value)

ответил(а) 2021-01-19T18:27:33+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема