OC之谓词
你是否遇到过这样的困惑,例如:利用前面学习的知识从plist文件中获取到一个数组,但是这个数组中有些数据你不想要,只想保留对你有用的数据,那么该怎么做呢?
我们可能会想到很多种解决办法,例如一个一个挑出来,对于程序员的我们来说,那就太low了,我们需要创建一个方法将我们的数据挑选出来。
OC的开发者们也想到了这个问题,所以为了提高我们的开发效率,给我们提供了一个专门应对这种状况的类——NSPredicate,中文翻译:谓词。
实际上,谓词就像是一个筛子(过滤器),帮助我们将需要的数据按照一定的条件挑选出来。所以本节将围绕NSPredicate来介绍一下怎样在一堆数据中获取到想要的数据。
首先,先来学习一下如何创建谓词,通过查看NSPredicate.h接口中的方法,我们可以找到这个方法:
+(NSPredicate*)predicateWithFormat:(NSString*)predicateFormat,...;
首先,这个是一个类方法,它返回的是一个NSPredicate类的对象,方法中留给我们的是一个字符串,这个字符串用来填写过滤条件。过滤条件的书写下面只介绍几种常用的:
SELE:代表每个数据本身
=、==:是相同的,都是等于的意思。
BETWEEN:采用:表达式 BETWEEN{下限,上限}的格式
AND、&&、OR、NOT
BEGINSWITH:检查某个字符串是否以指定的字符串开头,如:BEGINSWITH’a’
CONTAINS:检查是否包含指定的字符串。
LIKE:用于筛选时都匹配指定的字符串格式,如:name LIKE ‘*ac*’表示name字符串中是否有ac字符串。
通过上面的方法以及参数的介绍,我们可以轻松创建一个谓词,那么怎么使用创建好的谓词呢?
在NSPredicate类中,还可以看到这么几个方法:
-(NSArray<ObjectType>*)filteredArrayUsingPredicate:(NSPredicate *)predicate;
从名字上就知道用于过滤NSArray的。
-(void)filterUsingPredicate:(NSPredicate*)predicate;//用于过滤NSMutableArray数组的
-(NSSet<ObjectType>*)filteredSetUsingPredicate:(NSPredicate *)predicate;//用于过滤集合(NSSet,集合,和数组一样,都是存储数组的方法,区别就是集合中元素互异,使用的地方不多,和NSArray及其类似,非常简单,大家自学,这里不在过多解释。)
通过这些方法,我们可以轻松地得到我们想要的数据。给大家一个例子:
首先创建一个OC工程,在工程中创建一个Person类:
person.h中的代码:
age>20 :LiWu
age>20 :ZhangSi
(注意:在最后输出的时候,如果采用NSLog的方法,输出的是每个对象所占用的内存首地址,而不是具体的数据。大家可以上网搜索关于重写NSLog方法的代码,由于不属于OC的知识点,因此本文中不介绍)。
通过对谓词的学习,你是否看出使用谓词的弊端?通过谓词筛选的流程,我们可以看出,谓词过滤的是一些具有共性的数据,如果是杂乱没有规律的数据,我们如果使用谓词,反而会增加代码量。
所以,在实际编程过程中,要根据具体的环境,合理地选择实现地方式。
我们可能会想到很多种解决办法,例如一个一个挑出来,对于程序员的我们来说,那就太low了,我们需要创建一个方法将我们的数据挑选出来。
OC的开发者们也想到了这个问题,所以为了提高我们的开发效率,给我们提供了一个专门应对这种状况的类——NSPredicate,中文翻译:谓词。
实际上,谓词就像是一个筛子(过滤器),帮助我们将需要的数据按照一定的条件挑选出来。所以本节将围绕NSPredicate来介绍一下怎样在一堆数据中获取到想要的数据。
首先,先来学习一下如何创建谓词,通过查看NSPredicate.h接口中的方法,我们可以找到这个方法:
+(NSPredicate*)predicateWithFormat:(NSString*)predicateFormat,...;
首先,这个是一个类方法,它返回的是一个NSPredicate类的对象,方法中留给我们的是一个字符串,这个字符串用来填写过滤条件。过滤条件的书写下面只介绍几种常用的:
SELE:代表每个数据本身
=、==:是相同的,都是等于的意思。
BETWEEN:采用:表达式 BETWEEN{下限,上限}的格式
AND、&&、OR、NOT
BEGINSWITH:检查某个字符串是否以指定的字符串开头,如:BEGINSWITH’a’
CONTAINS:检查是否包含指定的字符串。
LIKE:用于筛选时都匹配指定的字符串格式,如:name LIKE ‘*ac*’表示name字符串中是否有ac字符串。
通过上面的方法以及参数的介绍,我们可以轻松创建一个谓词,那么怎么使用创建好的谓词呢?
在NSPredicate类中,还可以看到这么几个方法:
-(NSArray<ObjectType>*)filteredArrayUsingPredicate:(NSPredicate *)predicate;
从名字上就知道用于过滤NSArray的。
-(void)filterUsingPredicate:(NSPredicate*)predicate;//用于过滤NSMutableArray数组的
-(NSSet<ObjectType>*)filteredSetUsingPredicate:(NSPredicate *)predicate;//用于过滤集合(NSSet,集合,和数组一样,都是存储数组的方法,区别就是集合中元素互异,使用的地方不多,和NSArray及其类似,非常简单,大家自学,这里不在过多解释。)
通过这些方法,我们可以轻松地得到我们想要的数据。给大家一个例子:
首先创建一个OC工程,在工程中创建一个Person类:
person.h中的代码:
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,copy)NSString * name; @property (nonatomic,assign)int age; +(instancetype)personWithName:(NSString *)name age:(int)age; @endperson.m中的代码:
#import "Person.h" @implementation Person +(instancetype)personWithName:(NSString *)name age:(int)age{ Person * person=[[Person alloc] init]; person.name=name; person.age=age; return person; } @endmain.m文件中的代码:
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { NSArray * array=[NSArray arrayWithObjects: [Person personWithName:@"ZhangSan" age:10], [Person personWithName:@"LiSi" age:15], [Person personWithName:@"WangWu" age:20], [Person personWithName:@"WangLiu" age:25], [Person personWithName:@"LiWu" age:30], [Person personWithName:@"ZhangSi" age:35], nil]; NSPredicate * predicate=[NSPredicate predicateWithFormat:@"age>20"]; NSArray * myArray=[array filteredArrayUsingPredicate:predicate]; for (Person * person in myArray) { NSLog(@"age>20 :%@",person.name); } return 0; }输出结果:age>20 :WangLiu
age>20 :LiWu
age>20 :ZhangSi
(注意:在最后输出的时候,如果采用NSLog的方法,输出的是每个对象所占用的内存首地址,而不是具体的数据。大家可以上网搜索关于重写NSLog方法的代码,由于不属于OC的知识点,因此本文中不介绍)。
通过对谓词的学习,你是否看出使用谓词的弊端?通过谓词筛选的流程,我们可以看出,谓词过滤的是一些具有共性的数据,如果是杂乱没有规律的数据,我们如果使用谓词,反而会增加代码量。
所以,在实际编程过程中,要根据具体的环境,合理地选择实现地方式。