前言,前幾天在項目中需要根據(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"];
謂詞的其他用法可以參照文檔