我试图使用NSSortDescriptor以便在swift 4中使用密钥路径对结构列表进行排序。但是当NSSortDescriptor中有一个EXC_BAD_INSTRUCTION时,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运行时公开的对象。

最佳答案

实际上,基于keypath的排序描述符需要一个属性
暴露在objective-c运行时中,这需要一个class

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

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

关于swift - 快捷键路径在NSSortDescriptor中导致EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46756961/

10-12 07:11