ios - EXC_BAD_INSTRUCTION 对象数组分配 Swift

标签 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 上产生:

fatal error: array cannot be bridged from Objective-C

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

为什么?

最佳答案

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

关于ios - EXC_BAD_INSTRUCTION 对象数组分配 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27380846/

相关文章:

工具栏中条形按钮项底部的 Swift 条

swift - Swift 中协议(protocol)的父子关系

design-patterns - 协议(protocol):为什么一致性检查和可选要求需要@ObjC?

ios - UINavigationBar 应该是不透明的,但透明的 PNG 图像应该允许背景可见

ios - Swift 项目中的链接框架和库

ios - Xcode 模拟器 : how to remove older unneeded devices?

ios - 将视频保存到我的相机胶卷返回错误 : The operation couldn’t be completed.(Cocoa 错误 -1。)

ios - 动画 uicollectionviewcell,动画期间文本对齐偏离中心

C++ 到 Objective-C,在 for 循环中使用 const int

ios - 是否有可能读取 iOS 设备存储信息