Swift Key Path 导致 NSSortDescriptor 中的 EXC_BAD_INSTRUCTION

标签 swift cocoa swift4

我正在尝试使用 NSSortDescriptor,以便在 Swift 4 中使用键路径对结构列表进行排序。但是 NSSortDescriptor 的初始化因 而崩溃NSSortDescriptor

中的 EXC_BAD_INSTRUCTION
struct Foo {
    let bar : Int
    let baz : String
}

let x = [Foo(bar: 1, baz: "Hello"),
         Foo(bar: 2, baz: "World")]

let sortDescriptor = NSSortDescriptor(keyPath: \Foo.baz, ascending: true)

相关的堆栈跟踪如下所示。

#0  0x00000001007f97a0 in specialized _assertionFailure(_:_:file:line:flags:) ()
#1  0x0000000100ec5a12 in specialized static _KVOKeyPathBridgeMachinery._bridgeKeyPath(_:) ()
#2  0x0000000100e32142 in NSSortDescriptor.init<A, B>(keyPath:ascending:) ()

这让我认为 NSSortDescriptor 不适用于非 KVO 对象,但是编译器既没有给我警告,NSSortDescriptor 的文档也没有提到关键路径需要针对暴露给 Objective 的对象-C 运行时。

最佳答案

事实上,基于键路径的排序描述符需要一个属性 暴露给 Objective-C 运行时,并且需要一个:

class Foo {
    let bar : Int = 0
    @objc let baz : String = ""
}

无用的诊断已被追踪为 SR-5115 KeyPath-based KVO: No diagnostic for inaccessible KVO KeyPaths

关于Swift Key Path 导致 NSSortDescriptor 中的 EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46756961/

相关文章:

swift - "Init(URL:)"已重命名为 "init(url:)"- swift 3 wkwebview 错误

cocoa - 无法在 Interface Builder 中更改 NSTextField 的高度

ios - iPhone 上 802.11 QOS 控制的 TOS

objective-c - Cocoa - 相机开始录制时检测事件

ios - 如何使用具有自定义类变量的 UserDefaults 对自定义类对象进行编码?

swift - 如何在 Swift 程序中更新 SQLite 表中的列?

swift - 用于显示来自 Firebase 的子值计数的 UIButton 标签

swift - 在设备上运行时无法连接到 Realm 对象服务器

swift - 您将如何根据其值类型过滤 swift 字典?

ios - 如何在 Swift 3、4 和 5 中编写 dispatch_after GCD?