【问题标题】:CGrect NSArray errorCGrect NSArray 错误
【发布时间】:2016-05-26 09:21:29
【问题描述】:

我正在尝试从 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)

大家有什么建议吗?

【问题讨论】:

    标签: objective-c swift nsarray cgrect


    【解决方案1】:

    这不是NSArray

    var rects = [NSArray]()
    

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

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

    但是,我通常建议不要这样做(取决于您的确切用例),因为它添加了 Swift 本身不需要的包装器,并且降低了类型安全性。如果您需要在将其发送到 Objective-C API 之前在 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——以便在发送到Objective-C之前将每个CGRect包装在NSValue中。

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

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

    【讨论】:

      【解决方案2】:

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

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

      在您的情况下,您正在创建数组数组。这就是为什么它说“无法将'NSValue'类型的值转换为预期的参数类型'NSArray'”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多