【问题标题】:"[AnyObject]" is not identical to "NSArray"“[AnyObject]”与“NSArray”不同
【发布时间】:2014-07-19 00:21:23
【问题描述】:

我过去使用过的一个 Objective-c 函数的签名是:

- (MMCall *)getLocalizedAppCategoriesWithOptions:(MMOptions *)options
                          success:(void (^)(NSArray *response))success
                          failure:(void (^)(NSError *error))failure;

我习惯称它为-

[[whateverclassname new] getLocalizedAppCategoriesWithOptions:nil
                                                        success:^(NSArray *response) {
    }   failure:[^(NSError *error) {
}

它返回一个对象的 NSArray。这些对象的父类是 NSObject,它们的属性很少。 在尝试 swift 时,我用相应的头文件更新了桥接头文件。问题是 -

  1. 如果我按照以下方式调用它,我会收到编译错误,因为“'[AnyObject]' 与 'NSArray' 不同”

    whateverclassname().getLocalizedAppCategoriesWithOptions(nil, success: {(response : NSArray!) in
        }, failure: {(error: NSError!)  in
    })
    
  2. 如果我按照以下方式调用它,它会成功编译但应用程序在运行时崩溃 -

    whateverclassname().getLocalizedAppCategoriesWithOptions(nil, success: {(response : [AnyObject]!) in
        }, failure: {(error: NSError!)  in
    })
    

请帮我看看这是怎么回事?

【问题讨论】:

  • 当它崩溃时你会收到什么消息?
  • 没有这样的味精。但是线程在 [_NSArrayM insertObjectAtindex:] 之后显示 objc_exception_throw

标签: objective-c swift ios8


【解决方案1】:

找到我两个问题的答案 -

  1. 由于 NSArray 是不可变的,而 [AnyObject] 在 Swift 中是可变的 Array 类型,编译器会抱怨它们不相同。我改变了NSArray!到阵列!在 Swift 代码中。其他选择是将 Objective-C 代码更改为 success:(void (^)(NSMutableArray *response))success(不推荐,因为它会破坏使用网桥的目的)。

  2. 在 Objective-C 中调用块之前将数组转换为 NSMuatableArray

【讨论】:

  • 您还应该使用泛型数组,以便 Swift 可以接收具体的数组类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多