CGrect NSArray error



我正试图从Swift类创建一个CGRect数组,该数组最终将被发送到Objective C类。

据我所知,Objective C在创建CGRect数组时期望NSArrayNSMutableArray。我试图制作一个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)

有什么建议吗?

这不是NSArray:

var rects = [NSArray]()

这是NSArray对象的Swift数组(即数组中的数组)。如果要将NSValues附加到数组中,则需要一个[NSValue]

var rects = [NSValue]()
let v = NSValue(CGRect: feature.bounds)
rects.append(v)

然而,我通常建议不要这样做(取决于您的确切用例),因为它添加了Swift本身不需要的包装器,同时降低了类型安全性。如果您需要在Swift中将这个数组发送到Objective-C API之前与它交互,那么我会直接创建一个CGRects数组,正如@Bhushan所建议的那样。

var rects = [CGRect]()
rects.append(CGRect(x: 50, y: 50, width: 100, height: 100))

但是,您现在不能将此数组传递给NSArray参数,您将得到一个错误,称为Cannot convert value of type '[CGRect]' to '[AnyObject]'。为了处理这个问题,您可以简单地在数组中使用map,以便在将每个CGRect发送到Objective-C之前将其封装在NSValue中。

someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}

这样你就可以两全其美。您可以在Swift中使用CGRects数组,从而获得灵活性和类型安全性,还可以获得与Objective-C的互操作性。

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

var rectList = [CGRect]()
let rect1 = CGRectZero
rectList.append(rect1)

在您的案例中,您正在创建数组的数组。这就是为什么它说"无法将‘NSValue’类型的值转换为预期的参数类型‘NSArray’">

最新更新