什么是謂詞? ios面試攻克篇(二)


'寫在前面的話'
這些是我對iOS面試時會碰到的問題的解決方法,整理出來分享給大家,有些錯誤不要
笑了,希望對大家有所幫助。大家有更好的解決辦法也歡迎溝通交流。
一直以來都有寫點兒東西的想法,就從筆記、從閱讀開始吧,加油!'


Cocoa 提供了一個類 NSPredicate 類,該類主要用于指定過濾器的條件,該對象可以準確的描述所需條件,對每個對象通過謂詞進行篩選,判斷是否與條件相匹配。謂詞表示計算真值或假值的函數。

 NSPredicate *predicate;

    predicate=[NSPredicatepredicateWithFormat:@"name=='Herbie'"];//用predicateWithFormat創建一個謂詞,name作為鍵路徑

   BOOL match=[predicateevaluateWithObject:car];//car作為接收對象,evaluateWithObject返回一個bool值。

    NSLog(@"%s",(match)?"YES":"NO");

 

  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];

    NSArray *cars = [garage cars];

    for (Car *car in [garage cars]) {
        if ([predicate evaluateWithObject: car]) {
            NSLog (@"%@", car.name);

        }

    }
遍歷cars判斷是否是真,然后輸出。
  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];

    NSArray *results;

    results = [carsfilteredArrayUsingPredicate: predicate];//它將循環過濾數組內容,根據謂詞計算每個對象的值,并將值為YES的對象累計到將被返回的新數組中。

    NSLog (@"%@", results);

filteredArrayUsingPredicate這個方法可以得到我們所需要的值。加上
   NSArray *names;

    names=[results valueForKey:@"name"];

    NSLog (@"%@", names);
就和上面的值一樣。
NSMutableArray *carsCopy = [carsmutableCopy];

  [carsCopyfilterUsingPredicate: predicate];//filterUsingPredicate和NSMutableArray構成新數組。

  NSLog (@"%@", carsCopy);

  
predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > %d", 50];

results = [cars filteredArrayUsingPredicate: predicate];

NSLog (@"%@", results);
    

    NSPredicate *predicateTemplate;

    NSDictionary *varDict;

    predicateTemplate = [NSPredicatepredicateWithFormat: @"engine.horsepower > $POWER"];//創建一個鍵/值字典來存儲,這里$符號用于變量

    varDict = [NSDictionarydictionaryWithObjectsAndKeys:

               [NSNumbernumberWithInt: 150],@"POWER", nil];//@后面參數名

    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);


  predicate = [NSPredicatepredicateWithFormat:

                @"(engine.horsepower > 50) AND (engine.horsepower < 200)"];//可以運用運算符

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"oop %@", results);

    

    predicate = [NSPredicatepredicateWithFormat:

                @"engine.horsepower BETWEEN { 50, 200 }"];//這里可以運用between關鍵字。和上面效果一樣

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    

    NSArray *betweens = [NSArray arrayWithObjects:

                         [NSNumbernumberWithInt: 50], [NSNumbernumberWithInt: 200],nil];

    predicate = [NSPredicatepredicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    

    predicateTemplate = [NSPredicatepredicateWithFormat:@"engine.horsepower BETWEEN $POWERS"];

    varDict = [NSDictionarydictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];

    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];//用變量

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    

    predicate = [NSPredicatepredicateWithFormat:@"name < 'Newton'"];//不等號不僅可以用于數字,也可以用于字符串值。

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    

    predicate = [NSPredicatepredicateWithFormat:@"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//包含在其中用IN

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    

    predicate = [NSPredicatepredicateWithFormat:@"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self關鍵字

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    

    names = [cars valueForKey: @"name"];

    predicate = [NSPredicatepredicateWithFormat:@"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self關鍵字

    results = [namesfilteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    ```

    predicate = [NSPredicatepredicateWithFormat:@"name BEGINSWITH 'Bad'"];//字符串運算符BEGINSWITH,ENDSWITH,CONTAINS[c][d][cd]

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

BEGINSWITH:檢查某個字符串是否以另一個字符串開頭。

ENDSWITH:檢查某個字符串是否以另一個字符串結尾。

CONTAINS:檢查某個字符串是否以另一個字符串內部。

[c]不區分大小寫[d]不區分發音符號即沒有重音符號[cd]既不區分大小寫,又不區分發音符號。

代表通配符Like還接受[cd].下面所示↓

    predicate = [NSPredicatepredicateWithFormat:@"name LIKE[cd] '*er*'"];//*

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);
只匹配一個字符并且還可以接受[cd].下面所示↓
    predicate = [NSPredicatepredicateWithFormat:@"name LIKE[cd] '???er*'"];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);
還可以使用MATCHES運算符。賦給該運算符一個正則表達式。
iOS 謂詞(NSPredicate)的應用

Cocoa實際開發中可以是使用NSPredicate及其父類NSComparisonPredicate和NSCompoundPredicate.其風格類似于SQL查詢語言和正則表達式的混合體,提供了具有表現力的,自然語言界面來定義一個集合被搜尋的邏輯條件。一般來說稍微操作過數據庫基本上很容易理解其中的方法,至于使用的方法也很簡單。如下代碼是實現方法:

//  BIDValidateMgr.h
//  TongHuiShop
//
//  Created by eJiupi on 14-10-29.
//  Copyright (c) 2020年 xujinzhong. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface BIDValidateMgr : NSObject

//手機號碼驗證
+ (BOOL)validateMobile:(NSString *)mobile;

//郵箱
+ (BOOL)validateEmail:(NSString *)email;

//身份證號
+ (BOOL)validateIdentityCard: (NSString *)identityCard;

@end

BIDValidateMgr.m 實現代碼;

//
//  BIDValidateMgr.m
//  TongHuiShop
//
//  Created by eJiupi on 14-10-29.
//  Copyright (c) 2014年 xujinzhong. All rights reserved.
//

#import "BIDValidateMgr.h"

@implementation BIDValidateMgr

//手機號碼驗證
+ (BOOL)validateMobile:(NSString *)mobile
{
    //手機號以13, 15,18開頭,八個 \d 數字字符
    NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
    return [phoneTest evaluateWithObject:mobile];
}

//郵箱
+ (BOOL)validateEmail:(NSString *)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailTest evaluateWithObject:email];
}

//身份證號
+ (BOOL)validateIdentityCard: (NSString *)identityCard
{
    BOOL flag;
    if (identityCard.length <= 0) {
        flag = NO;
        return flag;
    }
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    return [identityCardPredicate evaluateWithObject:identityCard];
}

@end
iOS 謂詞(NSPredicate)的簡單使用案列

以上就是我收集的有關ios謂詞的理解!!
不知各位有什么看法,歡迎留言互動交流,我們一起學習、一起進步!!

謝謝你長的這么好看,還關注我!!!點個贊唄!!
這就是"謂詞"相關的點,如果有什么不對的請留言提示,然后有什么別的需要改進的提示請聯系我我會及時補充~

over.over.
文章轉載于:https://www.cnblogs.com/chengzi1994/p/3347075.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容