2016-08-18 8 views
2

複数のnull可能なNSPredicatesを結合するにはどうすればよいですか?以下のように例えば、何かを

var finalPredicate = NSPredicate(format: "") 

    if (screen != nil) { 
     screenPredicate = NSPredicate(format: "screen = %@", screen!) 
     finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [screenPredicate!]) 
    } 

    if (feature != nil) { 
     featurePredicate = NSPredicate(format: "feature = %@", feature!) 
     finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [finalPredicate, featurePredicate!]) 
    } 

    if (shouldDisplayPredicate != nil) { 
     shouldDisplayPredicate = NSPredicate(format: "shouldDisplay = %@", shouldDisplay!) 
     finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [finalPredicate, shouldDisplayPredicate!]) 
    } 
    if (hasDisplayed != nil) { 
     displayPredicate = NSPredicate(format: "hasDisplayed = %@", hasDisplayed!) 
     finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [finalPredicate, displayPredicate!]) 
    } 

は、述語がnullであるか、できなかったところ、これを行うには良い方法はありますか?

おかげ

答えて

1

まず、あなたが強制的にアンラップを避け、オプションの結合によって

if screen != nil { 
    // ... add predicate for `screen!` ... 
} 

を置き換える必要は:

if let screenValue = screen { 
    // ... add predicate for `screenValue` ... 
} 

は、そのトピックの良い概要についてはWhen should I compare an optional value to nil?を比較します。 同じOptionalmap()方法 を使用して、よりコンパクトに実現することができる。

screen.map { /* ... add predicate for `$0` ... } 

クロージャのみscreen != nil場合に呼び出され、その後$0 内部クロージャが開封された値です。

第2に、必要なすべての述語 を最初に入力し、複合述語を1回だけ作成する方が簡単です。 これにより、検索属性がまったく設定されていないかどうかを確認することもできます。訓練を受けていない(SWIFTで)目のために読むことが少し難しいものの

あなたのコードは、その後

var predicates: [NSPredicate] = [] 
if let screenValue = screen { 
    predicates.append(NSPredicate(format: "screen = %@", screenValue)) 
} 
if let featureValue = feature { 
    predicates.append(NSPredicate(format: "feature = %@", featureValue)) 
} 
// ... other search attributes ... 
if !predicates.isEmpty { 
    let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:predicates) 
} 

または

var predicates: [NSPredicate] = [] 
screen.map { predicates.append(NSPredicate(format: "screen = %@", $0)) } 
feature.map { predicates.append(NSPredicate(format: "feature = %@", $0)) } 
// ... other search attributes ... 
if !predicates.isEmpty { 
    let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:predicates) 
} 
+0

なっマップオプションがきちんと見えます。 – ofeida

+0

@ofeida:だから、私は両方を提示した理由です:) –

関連する問題