CGrect NSArray 错误

CGrect NSArray error

我正在尝试从 Swift class 创建一个 CGRect 数组,最终将发送到 Objective C class.

据我了解,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)

大家有什么建议吗?

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

var rectList = [CGRect]()

let rect1 = CGRectZero
rectList.append(rect1)

在您的例子中,您正在创建数组的数组。这就是为什么它说 "Cannot convert value of type 'NSValue' to expected argument type 'NSArray'"

这不是 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 的数组,如 .

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 之前将每个 CGRect 包装在 NSValue 中。

someObjCInstance.someProperty = rects.map{NSValue(CGRect:[=13=])}

这样您就可以两全其美。您可以获得能够在 Swift 中使用 CGRects 数组的灵活性和类型安全性,并且还可以获得与 Objective-C.

的互操作性