2016-06-01 3 views
0

У меня есть статический фильтр для включения/выключения для NSArrayController на основе проверки флажка. Сейчас я связала значение флажок для этого:Включить предикат NSArrayController на основе флажка

private dynamic var filterPending: NSNumber! { 
    willSet { 
     willChangeValueForKey("filterPredicate") 
    } 
    didSet { 
     didChangeValueForKey("filterPredicate") 
    } 
} 

, а затем я связала фильтр из NSArrayController к этому:

private dynamic var filterPredicate: NSPredicate? { 
    guard let filter = filterPending?.boolValue where filter == true else { return nil } 
    return NSPredicate(format: "pending > 0") 
} 

Это, кажется, работает нормально, но чувствует, что может быть Мне не хватает более простого способа сделать это?

+3

В ObjcC было бы '+ (NSSet *) keyPathsForValuesAffectingFilterPredicate {return [NSSet setWithObjects: @ "filterPending", nil]; } ', не знаю, как это переводится быстро. –

+0

Я мог бы это сделать, а не filterPending. Я думал, что может быть более простой способ, чем иметь «вещь», скажем, что предикат нуждается в изменении, а другой - для предиката. В принципе, есть более чистый способ сделать это без двух элементов, выполняемых в коде. – Gargoyle

ответ

0

В вашей настройке значение filterPredicateзависит от от значения filterPending. Как Герд K указывает, Key-Value Соблюдая API позволяет определить этот тип отношений путем регистрации filterPending как dependent key из filterPredicate:

// MyFile.swift 

class func keyPathsForValuesAffectingFilterPredicate() -> Set<NSObject> { 
    return Set<NSObject>(arrayLiteral: "filterPending") 
} 

private dynamic var filterPending: NSNumber! 

private dynamic var filterPredicate: NSPredicate? { 
    guard let filter = filterPending?.boolValue where filter == true else { return nil } 
    return NSPredicate(format: "pending > 0") 
} 
+0

Вам не нужно возвращать объект, вы можете просто вернуть Set ("filterPending") – Gargoyle