Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Objective c CGrect NSArray错误_Objective C_Swift_Nsarray_Cgrect - Fatal编程技术网

Objective c CGrect NSArray错误

Objective c CGrect NSArray错误,objective-c,swift,nsarray,cgrect,Objective C,Swift,Nsarray,Cgrect,我试图从一个Swift类创建一个CGRect数组,它最终将被发送到一个目标C类 据我所知,Objective C在创建CGRect数组时需要NSArray或NSMutableArray。我试图制作一个NSArray并附加CGRect,但它会打印错误: Cannot convert value of type 'NSValue' to expected argument type 'NSArray' Swift代码: var rects = [NSArray]()

我试图从一个Swift类创建一个CGRect数组,它最终将被发送到一个目标C类

据我所知,Objective C在创建CGRect数组时需要NSArray或NSMutableArray。我试图制作一个NSArray并附加CGRect,但它会打印错误:

 Cannot convert value of type 'NSValue' to expected argument type 'NSArray'
Swift代码:

            var rects = [NSArray]()
            let v = NSValue(CGRect: feature.bounds)
            rects.append(v)
各位有什么建议吗

如果必须在swift中创建CGRect数组,可以这样编写:

var rectList = [CGRect]()

let rect1 = CGRectZero
rectList.append(rect1)
在本例中,您正在创建数组的数组。这就是为什么它的说法不能将“NSValue”类型的值转换为预期的参数类型“NSArray”

这不是NSArray:

这是NSArray对象的快速数组,即数组中的数组。如果要将NSValue附加到数组中,则需要[NSValue]

然而,我通常会建议不要这样做,这取决于您的具体用例,因为它添加了Swift本身不需要的包装,并且降低了类型安全性。如果在发送给Objective-CAPI之前需要在Swift中与该数组进行交互,那么我将直接创建一个CGRECT数组,如下所示

但是,您现在无法将此数组传递给NSArray参数,您将得到一个错误,提示无法将“[CGRect]”类型的值转换为“[AnyObject]”。为了解决这个问题,您可以简单地在数组中使用map,以便在将每个CGRect发送到Objective-C之前将其包装在一个NSValue中

someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}
这样你就能两全其美。您可以在Swift中使用CGRECT数组,从而获得灵活性和类型安全性,还可以与Objective-C进行互操作

someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}
var rects = [CGRect]()
rects.append(CGRect(x: 50, y: 50, width: 100, height: 100))
someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}