【问题标题】:Swift Key Path causes EXC_BAD_INSTRUCTION in NSSortDescriptorSwift Key Path 在 NSSortDescriptor 中导致 EXC_BAD_INSTRUCTION
【发布时间】:2017-10-15 15:54:16
【问题描述】:

我正在尝试使用NSSortDescriptor,因此使用 Swift 4 中的 Key Path 对结构列表进行排序。但是 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 的文档也没有提到关键路径需要用于暴露给目标的对象-C 运行时。

【问题讨论】:

    标签: swift cocoa swift4


    【解决方案1】:

    确实,基于键路径的排序描述符需要一个属性 暴露于 Objective-C 运行时,这需要 class:

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

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

    【讨论】:

    • 感谢您的回答!那么 NSSortDescriptor 需要 Objective-C 运行时吗?我有点期待,但仍然有点无赖。我真的很想将它用于结构。
    • @ThomasBartelmess:是的。您也只能将它应用于NSArray,因此它对原生 Swift 类型的使用非常有限。
    【解决方案2】:

    要在swift 4中使用NSSortDescriptors对自定义类数组进行排序,你需要如下声明类。

    @objcMembers class Model:NSObject {
    
            var title:String
            var num:Int
            init(title:String,num:Int) {
                self.title = title
                self.num = num
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多