美文网首页iOS面试专辑
什么是谓词? ios面试攻克篇(二)

什么是谓词? ios面试攻克篇(二)

作者: iOS__开发者皮皮峰 | 来源:发表于2020-12-03 14:50 被阅读0次

    '写在前面的话'
    这些是我对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

    相关文章

      网友评论

        本文标题:什么是谓词? ios面试攻克篇(二)

        本文链接:https://www.haomeiwen.com/subject/ygtewktx.html