iOS面试专辑

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

2020-12-03  本文已影响0人  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

上一篇下一篇

猜你喜欢

热点阅读