CGrect NSArray 错误
CGrect NSArray error
我正在尝试从 Swift
class 创建一个 CGRect 数组,最终将发送到 Objective C
class.
据我了解,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)
在您的例子中,您正在创建数组的数组。这就是为什么它说 "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.
的互操作性
我正在尝试从 Swift
class 创建一个 CGRect 数组,最终将发送到 Objective C
class.
据我了解,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)
在您的例子中,您正在创建数组的数组。这就是为什么它说 "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.