【问题标题】:Swift - AnyObject[] is not a subtype of AnyObject[]?Swift - AnyObject[] 不是 AnyObject[] 的子类型?
【发布时间】:2014-07-26 16:08:12
【问题描述】:

我正在尝试调用一个目标 C 方法,该方法接受一个使用 NSArray 回调的块。

我得到以下编译错误:

AnyObject[] 不是 AnyObject[] 的子类型

[query fetchPlaces:^(NSArray *places, NSError *error) {

}];

斯威夫特

query.fetchPlaces() { (places: AnyObject[], error: NSError) -> Void in

}

【问题讨论】:

    标签: objective-c swift objective-c-blocks


    【解决方案1】:

    在 Objective-C 中,所有指针都可以设置为nil。这意味着placeserror 都可以是nil。从 Objective-C 转换到 Swift 时,您必须考虑到这一点。您必须将placeserror 定义为Optionals,以说明它们可以是nil

    query.fetchPlaces() { (places: AnyObject[]?, error: NSError?) -> Void in
    
    }
    

    如果您确定places 永远不会是nil。您也可以将其声明为 Implicitly Unwrapped Optional,让您将其视为不是可选的:

    query.fetchPlaces() { (places: AnyObject[]!, error: NSError?) -> Void in
    
    }
    

    注意:您必须使用旧版本的测试版(1 或 2)。您应该更新到最新的测试版。数组现在声明为 [SomeType] 而不是 SomeType[]

    【讨论】:

    • 感谢您最后的留言。我实际上很困惑,文档中的语法不起作用,但我猜到的语法确实:)
    【解决方案2】:

    在 Objective-c 中任何对象都可以为 nil,但在 Swift 中必须显式声明。在将 ObjC 转换为 Swift 时,所有 Objective-C 对象都变成了可选项。试试:

    query.fetchPlaces() { (places: AnyObject[]?, error: NSError?) -> Void in
    
    } 
    

    【讨论】:

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