我有一个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桥接数组
这是对这个问题的一次尝试:
为什么?
答案 0 :(得分:5)
Swift数组必须包含所有一种对象(例如所有String或所有Int)。 Objective-C NSArray可以包含许多不同类型的对象(例如,一些NSStrings和一些NSNumber)。因此,如果从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]
数组。