NSCompoundPredicateの注意点

Swiftにおいて検索条件を記述する場合、NSPredicateを使います。

NSPredicateを複数使った複雑な条件を記述する場合、NSCompoundPredicateを使ってNSPredicateを連結するのですが、注意点が必要です。

NSPredicateのinitializerの返り値はNSPredicate?とOptional型なのですが、NSCompoundPredicateのinitializerに渡すsubpredicatesは[NSPredicate?]ではなく、[NSPredicate]です。

そこで、例えば以下のように記述する必要があります。

let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType
    , subpredicates: [
        NSPredicate(format: "userId CONTAINS %@", searchText)!,
        NSPredicate(format: "name CONTAINS %@", searchText)!,
    ])

追記(’15/6/4)

Swift 1.2においては上記対応は必要ありません。参照、Swift 1.2への移行とNSPredicate | Hack

参考

ios – NSCompoundPredicate error in Xcode 6.1 – Stack Overflow