我想将CGPoint
值数组传递给另一个Objective-C
函数。
夫特:
var myPoints:[CGPoints]? = [CGPoint(x: 0, y:0)]
ObjCWrapper.callSomething(&myPoints)
目标C
+ (void) callSomething: (CGPoint []) points {...}
我得到的错误:
Cannot invoke 'callSomething' with an argument list of type 'inout [CGPoint]?)'
答案 0 :(得分:6)
问题是您已将myPoints
设为可选,即[CGPoint]?
而不是[CGPoint]
。从您的代码片段中,您不清楚为什么要这样做。如果不需要更广泛的上下文,只需删除?
并编译此代码。
注意,如果ObjCWrapper.callSomething
是您编写和控制的函数,请考虑如果它实际上不需要更改数组中的值,则需要const CGPoint []
。这样,它就不会是inout
所以你不需要在&
前面myPoints
,如果用let
声明它,你也可以使用它,即:
// no need to give a type, it can be inferred as [CGPoint]
let myPoints = [CGPoint(x: 0, y:0)]
ObjCWrapper.callSomething(myPoints)
如果您将其声明为:
+ (void) callSomething: (const CGPoint []) points {...}
另一方面,如果出于未显示的原因,它确实需要是一个可选数组,你将不得不使用一些解包技术来获取底层指针,而不是使用隐式互操作支持:
let myPoints: [CGPoint]? = [CGPoint(x: 0, y:0)]
myPoints?.withUnsafeBufferPointer { buf->Void in
ObjCWrapper.callSomething(buf.baseAddress)
}
或者,如果你不能改变callSomething
来获取一个const数组,那就太烦人了:
var myPoints: [CGPoint]? = [CGPoint(x: 0, y:0)]
myPoints?.withUnsafeMutableBufferPointer {
(inout buf: UnsafeMutableBufferPointer)->Void in
ObjCWrapper.callSomething(buf.baseAddress)
}
答案 1 :(得分:-2)
你做不到。 Objective-C NSArrays只能保存Class对象,而不能保存像CGPoints这样的标量。 (AnyObject,而不是Any。)您必须在NSValues中包装CGPoints才能将它们放入NSArray中。
没关系。我没有注意到Objective-C代码期望CGPoints的C数组,所以我的答案不适用。