簡述集合中過濾方式 之 NSPredicate

前言,前幾天在項目中需要根據(jù)某些條件對數(shù)組中的對象進行過濾,平時用到的都是遍歷的方式,之后通過if來匹配某些條件進行篩選。

當(dāng)時我的項目小組長告訴了一種新的過濾的方式,可以讓原來比較繁瑣的過濾方式變得更加簡單。- 遂記錄一下

如下代碼

for循環(huán)的過濾的方式:

NSMutableArray *oneStepList = [NSMutableArray new];
for (Task *ts in taskList) {
    if (ts.step == 1) {
       [oneStepList addObject: ts];
    }
}

使用Predicate(謂詞)的方式:

NSMutableArray *oneStepList = [taskList filteredArrayUsingPredicate:[NSPredicate predicateWithFormate:@"step = %ld", 1]];

上面兩段代碼非常的簡單,也非常的明顯,就是第二種方式會讓項目中的代碼結(jié)構(gòu)更具有可讀性,特別是對需要進行多層過濾的。

一些關(guān)于其他的討論

如果你是學(xué)計算機專業(yè)的,其實對Predicate(謂詞)應(yīng)該不會感到太陌生,在其他的一些語言中,也會用到,例如Java。而且謂詞的用法非常類似于SQL語句。只不過是將其對象化了而已,所以如果有SQL基礎(chǔ),學(xué)習(xí)Predicate其實非常的簡單。細分到Objective-C中,如下

  • 學(xué)習(xí)NSPredicate

首先學(xué)習(xí)網(wǎng)址:
Apple-NSPredicate
使用謂詞(NSPredicate)來提高集合遍歷與過濾查找的效率

如何創(chuàng)建一個NSPredicate參照官方文檔Predicate Programming Guide

  • 評估一個Predicates
NSPredicate *filterPredicate = [NSPredicate predicateWithFormate:@"SELF IN %@", @[@"Stig", @"Shaffiq", @"Chris"]];
BOOL result = [filterPredicate evaluateWithObject:@"Shaffiq"];

注: SELF是的是集合中的對象,判斷某個集合中的對象是否在給定的數(shù)組中。
返回值為yes,謂詞中有Shaffiq對象

  • Predicate支持 IN , BETWEEN 語法
NSPredicate *filterPredicate = [NSPredicate predicateWithFormate:@"SELF IN %@", @[@"Stig", @"Shaffiq", @"Chris"]];
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"age BETWEEN {1,5}"];
  • 支持=, !=, >, <等數(shù)學(xué)符號
NSPredicate *filterPredicate = [NSPredicate predicateWithFormate:@"SELF < 10"];
  • 對字符串,BEGINSWITH, ENDSWITH, CONTAINS語法,匹配字符串
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Adam" }.

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'e'"];
[array filterUsingPredicate:sPredicate];
// array now contains { @"Ben", @"Melissa" }

注:其中[c],表示的是不區(qū)分大小寫

  • 通配符
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[c] '*er'"];
  • 組合查詢 AND , OR
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er' AND age > 10"];

謂詞的其他用法可以參照文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容