0

我有一组 Printable 对象,但我需要它们符合 Equatable 和 AnyObject 标准。

private(set) var items: [Printable] = []

class func withItems<T: AnyObject where T: Equatable, T: Printable>(items: [T], selectedItem: T? = nil) {
   ... instance init ...
   instance.items = items
}

它导致 EXC_BAD_INSTRUCTION:

致命错误:无法从 Objective-C 桥接数组

这是对这个问题的一次尝试:

为什么?

4

1 回答 1

5

一个 Swift 数组必须包含所有一种对象(例如所有 String 或所有 Int)。一个Objective-C NSArray 可以包含许多不同种类的对象(例如一些NSStrings 和一些NSNumbers)。因此,如果你从 Objective-C 中得到这种数组,你就不能神奇地将它分配给 Swift 数组引用。

在这种情况下,我所做的就是调整数组以使其为 Swift 所接受。我不知道你从 Objective-C 得到的细节是什么;您的实际策略将取决于这些细节以及您想对阵列做什么。一种方法是将分配/强制转换为 AnyObject 的 Swift 数组。或者您可能决定将其保留为 NSArray 并完全通过 NSArray 方法使用它。

这是我自己的代码中的一个示例。arr是一个 NSArray,它是 NSString 和 NSNull 对象的混合包。我知道没有一个 NSString 对象是空字符串,所以我用空字符串替换了所有 NSNull 对象,从而给了我一个字符串数组,Swift 可以处理:

let arr2 = (arr as Array).map { $0 as? String ?? "" }

现在arr2是一个纯 Swift[String]数组。

于 2014-12-09T15:17:27.400 回答