首先,应避免强行拆包并更换
if screen != nil {
// ... add predicate for `screen!` ...
}
通过可选的绑定:
if let screenValue = screen {
// ... add predicate for `screenValue` ...
}
Compare 我什么时候应该将可选值与 nil 进行比较? https://stackoverflow.com/questions/29717210/when-should-i-compare-an-optional-value-to-nil以获得对该主题的良好概述。
使用以下方法可以更紧凑地实现相同的效果map()
方法
的Optional
:
screen.map { /* ... add predicate for `$0` ... }
仅当以下情况时才会调用闭包screen != nil
, 进而$0
里面
闭包是展开的值。
其次,用所有必需的谓词填充数组更简单
首先,只创建一次复合谓词。
这还允许您检查是否设置了任何搜索属性。
然后你的代码就变成了
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)
}
or
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)
}