2017-10-15 5 views
1

Je suis en train d'utiliser un NSSortDescriptor afin de trier une liste de struct en utilisant un chemin clé dans Swift 4. Mais l'initialisation des NSSortDescriptor accidents avec un EXC_BAD_INSTRUCTION dans NSSortDescriptorKey Path Swift provoque EXC_BAD_INSTRUCTION dans 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) 

La trace de pile correspondante ressemble à ceci.

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

Cela me fait penser que NSSortDescriptor ne fonctionne pas avec des objets non KVO, mais ni le compilateur me donne un avertissement, ni ne la documentation de NSSortDescriptor mentionner que le chemin de la clé doit être un objet qui est exposé à l'exécution Objective-C.

Répondre

1

En effet, le descripteur de tri à base keypath requiert une propriété qui est exposée à l'exécution Objective-C, et qui nécessite un class:

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

Les diagnostics inutiles est déjà tracée comme SR-5115 KeyPath-based KVO: No diagnostic for inaccessible KVO KeyPaths.

+0

Merci pour votre réponse! Donc le runtime Objective-C est nécessaire pour NSSortDescriptor? Je m'attendais à ça, mais c'était quand même un peu bête. J'aurais vraiment aimé l'utiliser pour les structures. –

+0

@ThomasBartelmess: Oui. Vous pouvez également l'appliquer uniquement à 'NSArray', donc son utilisation pour les types natifs Swift est très limitée. –