Мне нужно использовать функцию, которая использует UnsafeMutablePointer<UnsafeMutablePointer<Float>?>! в качестве параметра. Он написан в фреймворке на Objective-C++, и я обращаюсь к нему через связующий заголовок:
- (void) applyFilters: (float *) input_image input_params: (long *) input_params output_image : (float *) output_image output_params : (long *) output_params filter_id : (int) filter_id args : (float**) args
У меня возникли проблемы с пониманием структуры параметра args, которым является float**. В Swift он запрашивает параметр типа UnsafeMutablePointer<UnsafeMutablePointer<Float>>, который, как я предполагаю, указывает на массив массивов с плавающей запятой.
applyFilters(input_image: UnsafeMutablePointer<Float>!UnsafeMutablePointer<Float>!, input_params: UnsafeMutablePointer<Int>!, output_image: UnsafeMutablePointer<Float>!, output_params: UnsafeMutablePointer<Int>!, filter_id: Int32, args: UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!)
Если я создаю массив массивов с плавающей запятой, как мне указать на него с помощью UnsafeMutablePointer<UnsafeMutablePointer<Float>>, чтобы я мог передать его функции C++?





Разобрался как это сделать:
func arrayOfArrayExample() {
let floatArray: [[Float]] = [
[50.0, 23.0, 15.6],
[24.0, 9.5, 12.7]
]
let size1 = floatArray.count
let size2 = floatArray[0].count
var vectorBuf : UnsafeMutablePointer<Float>?
let bufferOut = UnsafeMutablePointer< UnsafeMutablePointer<Float>?>.allocate(capacity: Int(size1))
for i in 0..<size1 {
vectorBuf = UnsafeMutablePointer<Float>.allocate(capacity: size2)
for j in 0..<size2 {
vectorBuf!.advanced(by: j).pointee = floatArray[i][j]
}
bufferOut.advanced(by: i).pointee = vectorBuf
}
defer {
//deallocating memory
for i in 0..<size1 {
bufferOut.advanced(by: i).deallocate()
}
}
}
Переменная bufferOut возвращает указатель UnsafeMutablePointer<UnsafeMutablePointer<Float>>, указывающий на массив массивов с плавающей запятой, после чего освобождается память.
Возможно полезно: stackoverflow.com/questions/43810486/….