EXC_BAD_INSTRUCTION对象数组赋值Swift

时间:2014-12-09 14:05:46

标签: ios swift protocols exc-bad-instruction

我有一个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桥接数组

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

为什么?

1 个答案:

答案 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]数组。