ソフトウェア開発メモ

日々のソフトウェア設計、実装で考えている、気づいた事を書いています。それが真実か否かは保証しません。悪しからず。

NSPredicateを使って、ドメイン駆動設計でいう「Specification」を表現する。

はじめに

ご存じのとおり、iOSのNSPredicateクラスは配列をフィルターしたり、Core Dataでフェッチするための条件に使う物です。

条件文は複雑になり読みづらいですが、ドメイン駆動設計で言う「Specification」に基づいて、抽出条件を連想しやすいコンストラクタを用意して読み易くします。

表現方法

ネーミングの基本形は↓な感じになります。

predicateFor + (必要であれば条件を連想しやすい)形容詞+(クラスを連想しやすい名詞)名詞 + 前置詞 + (引数を表す)名詞、(引数を表す)名詞、(引数を表す)名詞

具体例

iOSAPIに良質な具体例があるので見てみましょう。ドキュメント検索アプリ「dash」等で検索すればいろいろ出てきます。

EKEventStore

- (NSPredicate )predicateForRemindersInCalendars:(NSArray )calendars

指定したカレンダー内の全てのリマインダーを見つけるための述語を返す。

- (NSPredicate )predicateForEventsWithStartDate:(NSDate )startDate endDate:(NSDate )endDate calendars:(NSArray )calendars

指定したカレンダー内の指定した期間の全てのイベントを見つけるための述語を返す。

- (NSPredicate )predicateForIncompleteRemindersWithDueDateStarting:(NSDate )startDate ending:(NSDate )endDate calendars:(NSArray )calendars

指定したカレンダー内の(オプションの)指定した期間の全ての未完了のリマインダーを見つける。

HKQuery

+ (NSPredicate )predicateForObjectsFromSources:(NSSet )sources

指定したソースらによって生成されたオブジェクトを見つけるための述語を返す。

+ (NSPredicate *)predicateForWorkoutsWithWorkoutActivityType:(HKWorkoutActivityType)workoutActivityType

指定したワークアウトタイプによって生成されたワークアウトを見つけるための述語を返す。