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