日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS之深入解析谓词NSPredicate的语法与应用

發(fā)布時間:2024/5/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS之深入解析谓词NSPredicate的语法与应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、簡介

  • NSPredicate 的官方解釋如下:
The NSPredicate class is used to define logical conditions used to constrain a search either for a fetch or for in-memory filtering.
  • NSPredicate 類是用來定義邏輯條件,用來有約束的獲取內(nèi)存中的對象或過濾搜索。
  • 簡而言之:只選取符合條件的對象。

二、基本語法

  • 使用謂詞(NSPredicate)都需要為謂詞定義謂詞表達式,而這個表達式必須是一個返回 BOOL 的值。
  • 謂詞表達式由表達式、運算符和值構(gòu)成。

① 比較運算符

  • =、==:判斷兩個表達式是否相等,在謂詞中 = 和 == 是相同的意思,而沒有賦值的概念。如下所示,當傳入數(shù)組對象時,報錯:*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSArrayI compare:]: unrecognized selector sent to instance 0x600000234c00’,可以發(fā)現(xiàn)底層調(diào)用了 compare: 方法。
NSString *string = @"1234"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = '1234'"];// 驗證對象是否符合條件,底層調(diào)用了 [xx compare:] 方法 if ([predicate evaluateWithObject:string]) {NSLog(@"Evaluate Success!\n"); } else {NSLog(@"Evaluate Fail!\n"); }// 輸出結(jié)果 Evaluate Success!
  • >=、=>:判斷左邊表達式的值是否大于或等于右邊表達式的值;
  • <=、=<:判斷左邊表達式的值是否小于或等于右邊表達式的值;
  • >:判斷左邊表達式的值是否大于右邊表達式的值;
  • <:判斷左邊表達式的值是否小于右邊表達式的值;
  • !=、<>:判斷兩個表達式是否不相等。

② 邏輯運算符

  • AND、&&:邏輯與,兩個表達式的值都為 YES 時,結(jié)果才為 YES;
  • OR、||:邏輯或,要求其中一個表達式為 YES 時,結(jié)果就是 YES;
  • NOT、!:邏輯非,對原有的表達式取反。

③ 關(guān)系運算符

  • ANY、SOME:集合中任意一個元素滿足條件,就返回 YES。
@interface Person : NSObject@property (nonatomic, copy) NSString * name; @property (nonatomic, assign) NSInteger age;@end- (void)test {NSArray *arr = @[ person1, person2, ...]; predicate = [NSPredicate predicateWithFormat:@"ANY name LIKE 'Tom*2'"];NSLog(@"%@", [arr filteredArrayUsingPredicate:predicate]); }// 輸出結(jié)果 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'
    • 根據(jù)報錯信息得知,謂詞表達式中 ANY 的操作的主體需要是 NSArray 或者 NSSet,上面 filteredArrayUsingPredicate: 方法傳入的是 Person 對象,所以報錯,因此 ANY 操作的數(shù)據(jù)結(jié)構(gòu)要是 @[@[]] 雙層數(shù)組。
{NSArray *arr = @[@[ person1, person2, ... ]]; predicate = [NSPredicate predicateWithFormat:@"ANY name LIKE 'Tom*2'"];NSLog(@"%@", [arr filteredArrayUsingPredicate:predicate]); }
  • ALL:集合中所有元素都滿足條件,才返回 YES。
  • NONE:集合中沒有任何元素滿足條件就返回 YES,等同于 not any。如: NONE person.age < 18,表示 person 集合中所有元素的 age >= 18 時,才返回 YES。
  • IN:等價于 SQL 語句中的 IN 運算符,只有當左邊表達式或值出現(xiàn)在右邊的集合中才會返回 YES。
predicateString = @"self.name IN {'Tom','Jay'} || self.age IN{25,30}"; predicate = [NSPredicate predicateWithFormat:predicateString];NSLog(@"%@ = %@", predicateString, [self.persons filteredArrayUsingPredicate:predicate]);

④ 范圍運算符

  • BETWEEN:BETWEEN 表達式必須滿足表達式 BETWEEN {下限,上限} 的格式,要求該表達式必須大于或等于下限,并小于或等于上限。
NSNumber *number = @(1234); predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {1000, 2000}"];if ([predicate evaluateWithObject:number]) {NSLog(@"Success!"); } else {NSLog(@"Fail!"); }// 輸出結(jié)果 Success!
  • IN:
NSNumber *number = @(1234); predicate = [NSPredicate predicateWithFormat:@"SELF IN {1000, 2000}"];if ([predicate evaluateWithObject:number]) {NSLog(@"Success!"); } else {NSLog(@"Fail!"); }// 輸出結(jié)果 Success!

⑤ 字符串比較運算符

  • BEGINSWITH:檢查某個字符串是否以指定的字符串開頭;
  • ENDSWITH:檢查某個字符串是否以指定的字符串結(jié)尾;
  • CONTAINS:檢查某個字符串是否包含指定的字符串;
  • LIKE:檢查某個字符串是否匹配指定的字符串模板。其之后可以跟 ? 代表一個字符和 * 代表任意多個字符。比如 “name LIKE ‘a(chǎn)c’”,這表示 name 的值中包含 ac 則返回 YES;“name LIKE ‘?ac*’”,表示 name 的第 2、3 個字符為 ac 時返回 YES;
  • MATCHES:檢查某個字符串是否匹配指定的正則表達式,雖然正則表達式的執(zhí)行效率是最低的,但其功能是最強大的,也是最常用的。
  • 注意:字符串比較都是區(qū)分大小寫和重音符號的。如:café 和 cafe 是不一樣的,Cafe 和 cafe 也是不一樣的。如果希望字符串比較運算不區(qū)分大小寫和重音符號,請在這些運算符后使用 [c]、[d] 選項,其中 [c] 是不區(qū)分大小寫,[d] 是不區(qū)分重音符號,其寫在字符串比較運算符之后,比如:name LIKE[cd] ‘cafe’,那么不論 name 是cafe、Cafe 還是 café 上面的表達式都會返回 YES。

⑥ 直接量

  • FALSE、NO:代表邏輯假;
  • TRUE、YES:代表邏輯真;
  • NULL、NIL:代表空值;
  • SELF:代表正在被判斷的對象自身,不區(qū)分大小寫,self 也可以;
  • “string” 或 ‘string’:代表字符串;
  • 數(shù)組:和 c 中的寫法相同,如:{‘one’, ‘two’, ‘three’};
  • 數(shù)值:包括整數(shù)、小數(shù)和科學計數(shù)法表示的形式;
  • 十六進制數(shù):0x開頭的數(shù)字;
  • 八進制:0o開頭的數(shù)字;
  • 二進制:0b開頭的數(shù)字。

⑦ 數(shù)組操作

  • array[index]:指定數(shù)組中特定索引處的元素;
  • array[first]:指定第一個元素;
  • array[last]:指定最后一個元素;
  • array[size]:指定數(shù)組大小。

⑧ 保留字

  • 下列單詞都是保留字(不區(qū)分大小寫):
AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE
  • 雖然大小寫都可以,但是更推薦使用大寫來表示這些保留字。

三、謂詞的用法

① 數(shù)據(jù)校驗

  • evaluateWithObject: 方法返回的是一個 BOOL 值,如果符合條件就返回 YES,不符合就返回 NO。常見的有判斷手機號碼、郵編等。
  • 手機號碼的判斷如下所:
// MATCHES(正則表達式) NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$"; NSString *phoneNumber = @"15180168516"; predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];if ([predicate evaluateWithObject:phoneNumber]) {NSLog(@"%@ 是手機號碼", phoneNumber); } else {NSLog(@"%@ 不是手機號碼", phoneNumber); }
  • 檢測字符串中是否有特殊字符:
- (BOOL)checkSpecialCharacter:(NSString *)string {NSString *regex = @"[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+";NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];return [pred evaluateWithObject:string]; }

② 過濾集合

  • 謂詞本身就代表了一個邏輯條件,計算謂詞之后返回的結(jié)果永遠為 BOOL 類型的值。而謂詞最常用的功能就是對集合進行過濾。
  • 當程序使用謂詞對集合元素進行過濾時,程序會自動遍歷其元素,并根據(jù)集合元素來計算謂詞的值,當這個集合中的元素計算謂詞并返回 YES 時,這個元素才會被保留下來。不過要注意程序會自動遍歷其元素,它會將自動遍歷過之后返回為 YES 的值重新組合成一個集合返回。
/*** @brief NSArray* @return 使用指定的謂詞過濾 NSArray 集合,返回符合條件的元素組成的新集合*/ - (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate;/*** @brief 使用指定的謂詞過濾 NSMutableArray,剔除集合中不符合條件的元素*/ - (void)filterUsingPredicate:(NSPredicate *)predicate;/*** @brief NSSet*/ - (NSSet<ObjectType> *)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0);/*** @brief NSMutableSet*/* (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0);
  • 使用謂詞過濾不可變集合和可變集合的區(qū)別是:過濾不可變集合時,會返回符合條件的集合元素組成的新集合;過濾可變集合時,沒有返回值,會直接剔除不符合條件的集合元素。

③ 在謂詞中使用占位符參數(shù)

  • 上面所有的例子中謂詞總是固定的,然而在現(xiàn)實中處理變量時決定了謂詞應(yīng)該是可變的。
  • 首先如果想在謂詞表達式中使用變量,那么需要了解下列兩種占位符,相當于變量名與變量值:
%K:用于動態(tài)傳入屬性名 %@:用于動態(tài)設(shè)置屬性值
  • 除此之外,還可以在謂詞表達式中使用動態(tài)改變的屬性值,就像環(huán)境變量一樣。
NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", key, value]; NSArray * filterArray = [array filteredArrayUsingPredicate:predicate];// 包含 $VALUE 字符串 NSPredicate * predicateTemp = [NSPredicate predicateWithFormat:@"%K > $VALUE", @"age"]; // 指定 $VALUE 的值為 25 NSPredicate * predicate2 = [predicateTemp predicateWithSubstitutionVariables:@{ @"VALUE" : @25} ]; filterArray = [array filteredArrayUsingPredicate:predicate2];

總結(jié)

以上是生活随笔為你收集整理的iOS之深入解析谓词NSPredicate的语法与应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。