我正在尝试从一个CGRect类创建一个Swift数组,这个数组最终将被发送到一个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)各位,有什么建议吗?
发布于 2016-05-26 10:19:40
这不是NSArray
var rects = [NSArray]()这是一个NSArray对象的Swift数组(即数组中的一个数组)。如果要将NSValues附加到数组中,则需要一个[NSValue]。
var rects = [NSValue]()
let v = NSValue(CGRect: feature.bounds)
rects.append(v)但是,我通常建议不要这样做(取决于您的确切用例),因为它添加了Swift本身不需要的包装器,并降低了类型安全性。如果您需要在将该数组发送到Objective之前在Swift中与该数组进行交互,那么我将直接创建一个CGRects数组,作为@Bhushan suggests。
var rects = [CGRect]()
rects.append(CGRect(x: 50, y: 50, width: 100, height: 100))但是,您现在不能将这个数组传递给NSArray参数,您将得到一个错误:Cannot convert value of type '[CGRect]' to '[AnyObject]'。为了处理这个问题,您只需在数组上使用map -以便在发送到目标C之前将每个CGRect封装在NSValue中。
someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}这样你就可以得到最好的两个世界。您可以在Swift中使用CGRects数组的灵活性和类型安全性,还可以获得与Objective的互操作性。
发布于 2016-05-26 09:31:00
如果您必须快速地创建CGRect数组,您可以这样编写:
var rectList = [CGRect]()
let rect1 = CGRectZero
rectList.append(rect1)在您的示例中,您正在创建数组数组。这就是为什么“不能将'NSValue‘类型的值转换为预期的参数类型’NSArray‘的原因。”
https://stackoverflow.com/questions/37456630
复制相似问题