如何将Swift数组传递给Objective-C函数

时间:2015-06-04 10:36:41

标签: objective-c swift

我想将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]?)'

2 个答案:

答案 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数组,所以我的答案不适用。