Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Swift数组传递给Objective-C函数_Objective C_Swift - Fatal编程技术网

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

如何将Swift数组传递给Objective-C函数,objective-c,swift,Objective C,Swift,我想将CGPoint值数组传递给另一个Objective-C函数 Swift: var myPoints:[CGPoints]? = [CGPoint(x: 0, y:0)] ObjCWrapper.callSomething(&myPoints) 目标-C + (void) callSomething: (CGPoint []) points {...} 我得到的错误是: Cannot invoke 'callSomething' with an argument list of

我想将
CGPoint
值数组传递给另一个
Objective-C
函数

Swift:

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

你不能那样做。Objective-C NSArray只能保存类对象,而不能保存CGPoints之类的标量。(AnyObject,不是Any。)必须将CGPoints包装在NSValues中,才能将它们放入NSArray中


别客气。我没有注意到Objective-C代码需要C数组的CGPoints,因此我的答案不适用。

问题是您将
myPoints
设置为可选,即
[CGPoint]?
而不是
[CGPoint]
。从您的代码片段中,不清楚为什么要这样做。如果不需要更广泛的上下文,只需删除
,这段代码就可以编译了

注意,如果<代码> ObjrWrPr.CaldSuths/Cux>是您编写和控制的函数,考虑将其取为<代码> const CGPoo[]/Cord>,而不是实际上需要更改数组中的值。这样,它就不会是
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
以获取常量数组,那么它会变得非常烦人:

var myPoints: [CGPoint]? = [CGPoint(x: 0, y:0)]
myPoints?.withUnsafeMutableBufferPointer {
  (inout buf: UnsafeMutableBufferPointer)->Void in
    ObjCWrapper.callSomething(buf.baseAddress)
}

谁说了关于NSArray的事?这是一个常规的C数组,使用一个不安全的指针可以很好地通过。@AirspeedVelocity,确实如此。(CGPoints的C数组)我在我的iPad上,错过了Objective-C代码。您不需要显式地将Swift数组强制转换为不安全的指针,以将其作为C数组传递给Objective-C吗?(我在Swift中对不安全的指针仍然很弱)不,只要一切设置正确,interop只会隐式地为您执行。虽然这里的问题是它是可选的,所以这不起作用。哇,真的吗?您可以在Objective-C代码中用C数组交换swift标量数组,而无需执行任何特殊操作?那太酷了。我不知道,是的。它会隐式地将
字符串
转换为
常量字符*
。我认为这个答案应该被认为是正确的@coyer