データのフィルター - Swift SDK
項目一覧
Overview
Realm 内のデータをフィルタリングするには、Realm のクエリ エンジンを活用できます。
バージョン 10.19.0 の新機能: : Realm Swift クエリ API
Realm Swift クエリ APIは、Swift 開発者がデータをクエリする慣用的な方法を提供します。 Swift スタイルの構文を使用して、オートコンプリートと型の安全性の利点を持つ Realm をクエリします。 Realm Swift クエリ API は、新しい SDK バージョンの NPredify Query API を置き換えるものではありません。代わりに、いずれかを使用できます。
10.19.0より前の SDK バージョン、または Objective-C 開発者の場合、Realm のクエリ エンジンはN述語クエリをサポートします。
このページの例について
このページの例では、タスク リスト アプリの単純なデータセットを使用しています。 Realm の 2 つのオブジェクトタイプは、 Project
とTask
です。 Task
には、名前、割り当て者の名前、完了したフラグがあります。 優先順位には任意の数値があり、優先順位が高いほど重要であり、その作業に費やされた時間数も存在します。 最後に、Task
には 1 つ以上のstring labels
と 1 つ以上の整数 ratings
を含めることができます。
Project
には 0 個以上のTasks
があります。
これらの 2 つのクラス、 Project
とTask
のスキーマを以下で参照してください。
// Task.h @interface Task : RLMObject @property NSString *name; @property bool isComplete; @property NSString *assignee; @property int priority; @property int progressMinutes; @end RLM_COLLECTION_TYPE(Task) // Task.m @implementation Task @end // Project.h @interface Project : RLMObject @property NSString *name; @property RLMArray<Task> *tasks; @end // Project.m @implementation Project @end
class Task: Object { var name = "" var isComplete = false var assignee: String? var priority = 0 var progressMinutes = 0 var labels: MutableSet<String> var ratings: MutableSet<Int> } class Project: Object { var name = "" var tasks: List<Task> }
次のコードを使用して、これらの例の Realm を設定できます。
RLMRealm *realm = [RLMRealm defaultRealm]; [realm transactionWithBlock:^() { // Add projects and tasks here }]; RLMResults *tasks = [Task allObjectsInRealm:realm]; RLMResults *projects = [Project allObjectsInRealm:realm];
let realm = try! Realm() try! realm.write { // Add tasks and projects here. let project = Project() project.name = "New Project" let task = Task() task.assignee = "Alex" task.priority = 5 project.tasks.append(task) realm.add(project) // ... } let tasks = realm.objects(Task.self) let projects = realm.objects(Project.self)
Realm Swift クエリ API
バージョン 10.19.0 の新機能: 10.19.0 より古い SDK バージョンの場合は、 NPredify クエリ API を使用します。
.where
Realm Swift クエリ APIを使用して、Swift スタイルの構文でフィルターを作成できます。
let realmSwiftQuery = projects.where { ($0.tasks.progressMinutes > 1) && ($0.tasks.assignee == "Ali") }
このクエリ API は、クエリを実行するためのNPredateを構築します。 これにより、開発者に直接使用できる型セーフな慣用 API が提供され、 NPredate 構築が抽象化されます。
.where
API は、true または false で評価するコールバックを受け取ります。 コールバックはクエリ対象の型のインスタンスを受け取ります。コンパイラーを活用して、有効なプロパティを参照する有効なクエリを作成しているかどうかを静的に確認できます。
このページの例では、コールバックに渡される変数を参照するために$0
の省略形を使用しています。
演算子
Realm コレクションをクエリするにはいくつかのタイプの演算子があります。 クエリは、クエリ対象のコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrue
に解決される場合、Realm Database は結果コレクションにオブジェクトを含めます。
比較演算子
Realm Swift Query API で Swift 比較演算子を使用できます( ==
、 !=
、 >
、 >=
、 <
、 <=
)。
例
次の例では、クエリ エンジンの比較演算子を使用して次のようにします。
priority
プロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。progressMinutes
プロパティが一定の値以上であるかどうかを確認して、実行時間が長いタスクを見つけます。assignee
プロパティがnull
に等しいタスクを見つけて、割り当てられていないタスクを見つけます。
let highPriorityTasks = tasks.where { $0.priority > 5 } print("High-priority tasks: \(highPriorityTasks.count)") let longRunningTasks = tasks.where { $0.progressMinutes >= 120 } print("Long running tasks: \(longRunningTasks.count)") let unassignedTasks = tasks.where { $0.assignee == nil } print("Unassigned tasks: \(unassignedTasks.count)")
コレクション
.contains
演算子を使用して、コレクション内の値をクエリできます。 個々の値を要素ごとに検索することも、範囲内を検索することもできます。
演算子 | 説明 |
---|---|
.in(_ collection:) | 式で参照されるプロパティが指定された配列に要素を含む場合、 |
.contains(_ element:) |
|
|
|
|
|
例
labels
MutableSet コレクション プロパティに「quickwin」が含まれているタスクを見つけます。progressMinutes
プロパティが指定された分の範囲内にあるタスクを検索します。
let quickWinTasks = tasks.where { $0.labels.contains("quick win") } print("Tasks labeled 'quick win': \(quickWinTasks.count)") let progressBetween30and60 = tasks.where { $0.progressMinutes.contains(30...60) } print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")
labels
MutableSet コレクション プロパティに、指定された配列内の要素のいずれかが含まれているタスクを検索します(「qui順」または「バグ」)。
let quickWinOrBugTasks = tasks.where { $0.labels.containsAny(in: ["quick win", "bug"]) } print("Tasks labeled 'quick win' or 'bug': \(quickWinOrBugTasks.count)")
バージョン 10.23.0 の新機能: : IN
演算子
Realm Swift クエリ API でIN
演算子がサポートされるようになりました。 式で参照されるプロパティに 値が含まれている場合は、 true
と評価されます。
例
assignee
プロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。
let taskAssigneeInAliOrJamie = tasks.where { let assigneeNames = ["Ali", "Jamie"] return $0.assignee.in(assigneeNames) } print("Tasks IN Ali or Jamie: \(taskAssigneeInAliOrJamie.count)")
論理演算子
Swift 論理演算子を使用して複合クエリを作成できます( &&
、 !
、 ||
)。
例
クエリ言語の論理演算子を使用して、Ali の完了したタスクをすべて検索できます。 つまり、 assignee
プロパティ値が 'Ali' に等しく、かつisComplete
プロパティ値がtrue
であるすべてのタスクを検索します。
let aliComplete = tasks.where { ($0.assignee == "Ali") && ($0.isComplete == true) } print("Ali's complete tasks: \(aliComplete.count)")
string演算子
これらの string 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。
注意
string 演算子では、次のオプションを使用できます。
.caseInsensitive
、大文字と小文字を区別しない$0.name.contains("f", options: .caseInsensitive) .diacriticInsensitive
発音区別符号を区別しないため、Realm は特殊文字を基本文字として扱い(例:é
->e
)。$0.name.contains("e", options: .diacriticInsensitive)
演算子 | 説明 |
---|---|
.starts(with value: String) | コレクションに指定された string 値で始まる要素が含まれている場合、 |
.contains(_ value: String) | 左側のstring式が右側のstring式のどこにある場合は、 |
.ends(with value: String) | コレクションに指定された string 値で値が終わる要素が含まれている場合、 |
.like(_ value: String) | 左側の string 式が右側の string ワイルドカード string 式と一致する場合、
たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。 |
== | 左側の文字列が右側のstringと辞書的に等しい場合、 |
!= | 左側のstringが右側の文字列と辞書編集順に等しくない場合、 |
例
次の例では、クエリ エンジンの string 演算子を使用して次のものを検索します。
名前が文字「e」で始まる名前のプロジェクト
名前に「つまり」が含まれるプロジェクト
値が
Al?x
に似たassignee
プロパティを持つプロジェクト発音区別符号を区別しない E のような文字を含むプロジェクト
// Use the .caseInsensitive option for case-insensitivity. let startWithE = projects.where { $0.name.starts(with: "e", options: .caseInsensitive) } print("Projects that start with 'e': \(startWithE.count)") let containIe = projects.where { $0.name.contains("ie") } print("Projects that contain 'ie': \(containIe.count)") let likeWildcard = tasks.where { $0.assignee.like("Al?x") } print("Tasks with assignees like Al?x: \(likeWildcard.count)") // Use the .diacreticInsensitive option for diacritic insensitivty: contains 'e', 'E', 'é', etc. let containElike = projects.where { $0.name.contains("e", options: .diacriticInsensitive) } print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")
注意
stringソートと大文字と小文字を区別しないクエリは、「ラテン語の基本」、「ラテン語の追加」、「ラテン語の拡張 A」、および「ラテン語の拡張 B」の文字セットでのみサポートされます(UTF-8 範囲 0 ~ 591)。
地理空間演算子
バージョン 10.47.0 の新機能。
geoWithin
演算子を使用して、SDK の提供された形状のいずれかを持つ地理空間データをクエリします。
GeoCircle
GeoBox
GeoPolygon
この演算子は次の場合にtrue
と評価されます。
オブジェクトには、Point の値を持つ
String
プロパティと、経度と緯度のペアを含むList
を含む地理空間データ「シェイプ」があります。永続化されたオブジェクトの経度/緯度は、 地理空間クエリシェイプ 内に含まれます。
let companiesInSmallCircle = realm.objects(Geospatial_Company.self).where { $0.location.geoWithin(smallCircle!) } print("Number of companies in small circle: \(companiesInSmallCircle.count)")
地理空間データのクエリの詳細については、「 地理空間データのクエリ 」を参照してください。
集計演算子
Realm オブジェクトのコレクション プロパティに集計演算子を適用できます。 集計演算子はコレクションを走査して、単一の値に縮小します。
演算子 | 説明 |
---|---|
.avg | コレクション全体の特定の数値プロパティの平均値を評価します。 |
.count | 指定されたコレクション内のオブジェクトの数を評価します。 これは現在、対多の関係コレクションでのみサポートされており、プリミティブのリストではサポートされていません。 プリミティブのリストで |
.max | コレクション全体で特定の数値プロパティの最も高い値を評価します。 |
.min | コレクション全体で特定の数値プロパティの最小値として評価されます。 |
.sum | コレクション全体の指定された数値プロパティの合計を評価します。 |
例
データのさまざまなファセットを表示するために、フィルターがいくつか作成されます。
タスクの平均優先順位が 5 を超えるプロジェクト。
優先順位が 5 未満のタスクのみを含むプロジェクト。
すべてのタスクの優先順位が 5 を超えるプロジェクト。
5 つを超えるタスクを含むプロジェクト。
長時間実行されているプロジェクト。
let averageTaskPriorityAbove5 = projects.where { $0.tasks.priority.avg > 5 } print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)") let allTasksLowerPriority = projects.where { $0.tasks.priority.max < 5 } print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)") let allTasksHighPriority = projects.where { $0.tasks.priority.min > 5 } print("Projects where all tasks are high priority: \(allTasksHighPriority.count)") let moreThan5Tasks = projects.where { $0.tasks.count > 5 } print("Projects with more than 5 tasks: \(moreThan5Tasks.count)") let longRunningProjects = projects.where { $0.tasks.progressMinutes.sum > 100 } print("Long running projects: \(longRunningProjects.count)")
集合演算子
セット演算子は、特定のルールを使用して、オブジェクトの特定のリストプロパティのすべての要素に特定のクエリ式を適用し、各入力コレクション オブジェクトを出力コレクションに渡すかどうかを決定します。
例
projects
コレクションで次のクエリを実行すると、次の値が返されます。
string
labels
のセットに「qui順」、「バグ」のいずれかが含まれているプロジェクト。整数
ratings
のセット内のいずれかの要素が 3 より大きいプロジェクト。
let projectsWithGivenLabels = projects.where { $0.tasks.labels.containsAny(in: ["quick win", "bug"]) } print("Projects with quick wins: \(projectsWithGivenLabels.count)") let projectsWithRatingsOver3 = projects.where { $0.tasks.ratings > 3 } print("Projects with any ratings over 3: \(projectsWithRatingsOver3.count)")
サブクエリ
サブクエリを使用して、別のクエリでコレクション プロパティを反復処理できます。 サブクエリを作成するには、式を括弧で囲み、その直後に.count
集計演算子を使用する必要があります。
(<query>).count > n
式が有効なサブクエリを生成しない場合は、実行時に例外が発生します。
例
projects
コレクションで次のクエリを実行すると、Alex という名前のユーザーによって完了していないタスクを含むプロジェクトが返されます。
let subquery = projects.where { ($0.tasks.isComplete == false && $0.tasks.assignee == "Alex").count > 0 } print("Projects with incomplete tasks assigned to Alex: \(subquery.count)")
NPredate クエリ
NPredate を使用してフィルターを構築できます。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"progressMinutes > %@ AND name == %@", @1, @"Ali"];
let predicate = NSPredicate(format: "progressMinutes > 1 AND name == %@", "Ali")
式
フィルターは、NPredate の式で構成されます。 式は、次のいずれかで構成されます。
現在評価されているオブジェクトのプロパティの名前(キーパス)。
演算子と最大 2 つの引数式(s)。
string (
'hello'
)や数値(5
)などの値。
ドット表記
オブジェクト プロパティを参照する場合、ドット表記を使用してそのオブジェクトの子プロパティを参照できます。 ドット表記で埋め込みオブジェクトと関係のプロパティを参照することもできます。
たとえば、ワークプレイス オブジェクトを参照するworkplace
プロパティを持つオブジェクトに対するクエリを考えてみましょう。 ワークプレイス オブジェクトには、埋め込みオブジェクト プロパティaddress
があります。 ドット表記を連鎖させて、その住所の郵便番号プロパティを参照できます。
workplace.address.zipcode == 10012
置換
述語形式の string では、次の置換を使用できます。
%@
は の値を指定します%K
キーパス を指定する
[NSPredicate predicateWithFormat:@"%K > %@ AND %K == %@", @"progressMinutes", @1, @"name", @"Ali"];
NSPredicate(format: "%K > %@ AND %K == %@", "progressMinutes", NSNumber(1), "name", "Ali")
演算子
Realm コレクションをフィルタリングするために使用できる演算子にはいくつかのタイプがあります。 フィルターは、フィルタリングされるコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrue
に解決される場合、Realm Database は結果コレクションにオブジェクトを含めます。
比較演算子
検索の最も簡単な操作は、値を比較することです。
重要
タイプは一致する必要があります
演算子の両方の型は等しくなければなりません。 たとえば、 ObjectId を stringと比較すると、前提条件が失敗し、次のようなメッセージが表示されます。
"Expected object of type object id for property 'id' on object of type 'User', but received: 11223344556677889900aabb (Invalid value)"
任意の数値型を他の任意の数値型と比較できます。
演算子 | 説明 |
---|---|
| 左側の数値式または日付式が右側の範囲と等しい場合、 |
== , = | 左側の式が右側の式と等しい場合は、 |
> | 左側の数値または日付式が右側の数値または日付式より大きい場合は、 |
>= | 左側の数値または日付式が右側の数値または日付式より大きい場合、 |
| 左側の式が右側のリストまたは string にある場合、 |
< | 左側の数値または日付式が右側の数値または日付式より小さい場合は、 |
<= | 左側の数値式が右側の数値式より小さい場合、 |
!= , <> | 左側の式が右側の式と等しくない場合、 |
例
次の例では、クエリ エンジンの比較演算子を使用して次のようにします。
priority
プロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。progressMinutes
プロパティが一定の値以上であるかどうかを確認して、実行時間が長いタスクを見つけます。assignee
プロパティがnull
に等しいタスクを見つけて、割り当てられていないタスクを見つけます。assignee
プロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。
NSLog(@"High priority tasks: %lu", [[tasks objectsWithPredicate:[NSPredicate predicateWithFormat:@"priority > %@", @5]] count]); NSLog(@"Short running tasks: %lu", [[tasks objectsWhere:@"progressMinutes between {1, 15}"] count]); NSLog(@"Unassigned tasks: %lu", [[tasks objectsWhere:@"assignee == nil"] count]); NSLog(@"Ali or Jamie's tasks: %lu", [[tasks objectsWhere:@"assignee IN {'Ali', 'Jamie'}"] count]); NSLog(@"Tasks with progress between 30 and 60 minutes: %lu", [[tasks objectsWhere:@"progressMinutes BETWEEN {30, 60}"] count]);
let highPriorityTasks = tasks.filter("priority > 5") print("High priority tasks: \(highPriorityTasks.count)") let longRunningTasks = tasks.filter("progressMinutes > 120") print("Long running tasks: \(longRunningTasks.count)") let unassignedTasks = tasks.filter("assignee == nil") print("Unassigned tasks: \(unassignedTasks.count)") let aliOrJamiesTasks = tasks.filter("assignee IN {'Ali', 'Jamie'}") print("Ali or Jamie's tasks: \(aliOrJamiesTasks.count)") let progressBetween30and60 = tasks.filter("progressMinutes BETWEEN {30, 60}") print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")
論理演算子
論理演算子を使用して複合述語を作成できます。
演算子 | 説明 |
---|---|
and && | 左側の式と右側の式の両方が |
not ! | 指定された式の結果を否定します。 |
or || | いずれかの式が |
例
クエリ言語の論理演算子を使用して、Ali の完了したタスクをすべて検索できます。 つまり、 assignee
プロパティ値が 'Ali' に等しく、かつisComplete
プロパティ値がtrue
であるすべてのタスクを検索します。
NSLog(@"Ali's complete tasks: %lu", [[tasks objectsWhere:@"assignee == 'Ali' AND isComplete == true"] count]);
let aliComplete = tasks.filter("assignee == 'Ali' AND isComplete == true") print("Ali's complete tasks: \(aliComplete.count)")
string演算子
これらの string 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。
注意
string 演算子では、次の修飾子を使用できます。
[c]
、大文字と小文字を区別しない[NSPredicate predicateWithFormat: @"name CONTAINS[c] 'f'"] NSPredicate(format: "name CONTAINS[c] 'f'") [d]
発音区別符号を区別しないため、Realm は特殊文字を基本文字として扱い(例:é
->e
)。[NSPredicate predicateWithFormat: @"name CONTAINS[d] 'e'"] NSPredicate(format: "name CONTAINS[d] 'e'")
演算子 | 説明 |
---|---|
beginsWith | 左側の文字string式が右側のstring式で始まる場合は、 |
contains , in | 左側のstring式が右側のstring式のどこにある場合は、 |
endsWith | 左側の文字string式が右側のstring式で終わる場合は、 |
like | 左側の string 式が右側の string ワイルドカード string 式と一致する場合、
たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。 |
== , = | 左側の文字列が右側のstringと辞書的に等しい場合、 |
!= , <> | 左側のstringが右側の文字列と辞書編集順に等しくない場合、 |
例
クエリ エンジンの string 演算子を使用して、名前が文字「e」で始まるプロジェクトと、名前に「ie」が含まれるプロジェクトを検索します。
// Use [c] for case-insensitivity. NSLog(@"Projects that start with 'e': %lu", [[projects objectsWhere:@"name BEGINSWITH[c] 'e'"] count]); NSLog(@"Projects that contain 'ie': %lu", [[projects objectsWhere:@"name CONTAINS 'ie'"] count]);
// Use [c] for case-insensitivity. let startWithE = projects.filter("name BEGINSWITH[c] 'e'") print("Projects that start with 'e': \(startWithE.count)") let containIe = projects.filter("name CONTAINS 'ie'") print("Projects that contain 'ie': \(containIe.count)") // [d] for diacritic insensitivty: contains 'e', 'E', 'é', etc. let containElike = projects.filter("name CONTAINS[cd] 'e'") print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")
注意
stringソートと大文字と小文字を区別しないクエリは、「ラテン語の基本」、「ラテン語の追加」、「ラテン語の拡張 A」、および「ラテン語の拡張 B」の文字セットでのみサポートされます(UTF-8 範囲 0 ~ 591)。
地理空間演算子
バージョン 10.47.0 の新機能。
SDK に指定されたシェイプのいずれかでIN
演算子を使用して、地理空間クエリを実行できます。
GeoCircle
GeoBox
GeoPolygon
この演算子は次の場合にtrue
と評価されます。
オブジェクトには、Point の値を持つ
String
プロパティと、経度と緯度のペアを含むList
を含む地理空間データ「シェイプ」があります。永続化されたオブジェクトの経度/緯度は、 地理空間クエリシェイプ 内に含まれます。
let filterArguments = NSMutableArray() filterArguments.add(largeBox) let companiesInLargeBox = realm.objects(Geospatial_Company.self) .filter(NSPredicate(format: "location IN %@", argumentArray: filterArguments as? [Any])) print("Number of companies in large box: \(companiesInLargeBox.count)")
地理空間データのクエリの詳細については、「 地理空間データのクエリ 」を参照してください。
集計演算子
Realm オブジェクトのコレクション プロパティに集計演算子を適用できます。 集計演算子はコレクションを走査して、単一の値に縮小します。
演算子 | 説明 |
---|---|
@avg | コレクション全体の特定の数値プロパティの平均値を評価します。 |
@count | 指定されたコレクション内のオブジェクトの数を評価します。 これは現在、対多の関係コレクションでのみサポートされており、プリミティブのリストではサポートされていません。 プリミティブのリストで |
@max | コレクション全体で特定の数値プロパティの最も高い値を評価します。 |
@min | コレクション全体で特定の数値プロパティの最小値として評価されます。 |
@sum | コレクション全体の指定された数値プロパティの合計を評価します。 |
例
データのさまざまなファセットを表示するために、フィルターがいくつか作成されます。
タスクの平均優先順位が 5 を超えるプロジェクト。
長時間実行されているプロジェクト。
NSLog(@"Projects with average tasks priority above 5: %lu", [[projects objectsWhere:@"tasks.@avg.priority > 5"] count]); NSLog(@"Projects where all tasks are lower priority: %lu", [[projects objectsWhere:@"tasks.@max.priority < 5"] count]); NSLog(@"Projects where all tasks are high priority: %lu", [[projects objectsWhere:@"tasks.@min.priority > 5"] count]); NSLog(@"Projects with more than 5 tasks: %lu", [[projects objectsWhere:@"tasks.@count > 5"] count]); NSLog(@"Long running projects: %lu", [[projects objectsWhere:@"tasks.@sum.progressMinutes > 100"] count]);
let averageTaskPriorityAbove5 = projects.filter("tasks.@avg.priority > 5") print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)") let allTasksLowerPriority = projects.filter("tasks.@max.priority < 5") print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)") let allTasksHighPriority = projects.filter("tasks.@min.priority > 5") print("Projects where all tasks are high priority: \(allTasksHighPriority.count)") let moreThan5Tasks = projects.filter("tasks.@count > 5") print("Projects with more than 5 tasks: \(moreThan5Tasks.count)") let longRunningProjects = projects.filter("tasks.@sum.progressMinutes > 100") print("Long running projects: \(longRunningProjects.count)")
集合演算子
セット演算子は、特定のルールを使用して、オブジェクトの特定のリストプロパティのすべての要素に特定の述語を適用し、各入力コレクション オブジェクトを出力コレクションに渡すかどうかを決定します。
演算子 | 説明 |
---|---|
| コレクション内のすべてのオブジェクトに対して述語が |
| コレクション内のすべてのオブジェクトに対して述語が |
| コレクション内のすべてのオブジェクトに対して述語が false と評価されるオブジェクトを返します。 |
例
クエリ エンジンのセット演算子を使用して、以下を検索します。
完了したタスクがないプロジェクト。
最優先順位のタスクがあるプロジェクト。
NSLog(@"Projects with no complete tasks: %lu", [[projects objectsWhere:@"NONE tasks.isComplete == true"] count]); NSLog(@"Projects with any top priority tasks: %lu", [[projects objectsWhere:@"ANY tasks.priority == 10"] count]);
let noCompleteTasks = projects.filter("NONE tasks.isComplete == true") print("Projects with no complete tasks: \(noCompleteTasks.count)") let anyTopPriorityTasks = projects.filter("ANY tasks.priority == 10") print("Projects with any top priority tasks: \(anyTopPriorityTasks.count)")
サブクエリ
SUBQUERY()
述語関数を使用して、コレクション プロパティを別のクエリで反復処理できます。 SUBQUERY()
の署名は次のとおりです。
SUBQUERY(<collection>, <variableName>, <predicate>)
collection
: 反復処理するリスト プロパティの名前variableName
: サブクエリで使用する現在の要素の変数名predicate
: サブクエリ述語を含む string。 現在反復処理されている要素は、variableName
で指定された変数名で使用できます。
例
projects
コレクションで次のフィルターを実行すると、Alex という名前のユーザーによって完了していないタスクが返されます。
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SUBQUERY(tasks, $task, $task.isComplete == %@ AND $task.assignee == %@).@count > 0", @NO, @"Alex"]; NSLog(@"Projects with incomplete tasks assigned to Alex: %lu", [[projects objectsWithPredicate:predicate] count]);
let predicate = NSPredicate( format: "SUBQUERY(tasks, $task, $task.isComplete == false AND $task.assignee == %@).@count > 0", "Alex") print("Projects with incomplete tasks assigned to Alex: \(projects.filter(predicate).count)")