我正试图从Swift
类创建一个CGRect数组,该数组最终将被发送到Objective 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)
有什么建议吗?
这不是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’">