2017-10-15 15 views
1

我試圖使用NSSortDescriptor所以排序斯威夫特4.使用鍵路徑結構的列表但NSSortDescriptor崩潰與EXC_BAD_INSTRUCTIONNSSortDescriptor斯威夫特關鍵路徑導致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不與非志願對象的工作,但無論是編譯器給我一個警告,也沒有NSSortDescriptor的文件提到的關鍵路徑需要一個對象,它是暴露於Objective-C運行時。

回答

1

事實上,基於的keyPath排序描述符要求其 暴露在Objective-C運行的屬性,而這需要class

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

無益的診斷已經作爲跟蹤SR-5115 KeyPath-based KVO: No diagnostic for inaccessible KVO KeyPaths

+0

感謝您的回答!那麼NSSortDescriptor需要Objective-C運行時?我有點期待,但仍然是一個無賴。我真的很想將它用於結構。 –

+0

@ThomasBartelmess:是的。你也可以只將它應用於'NSArray',所以它對本地Swift類型的使用非常有限。 –