OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据
#import "ViewController.h"
#import "PredicateModel.h"
@interface ViewController ()
@property (nonatomic,strong) NSMutableArray *modelArray;
@property (nonatomic,strong) NSMutableArray *searchResultArray;
@end
@implementation ViewController
-(NSMutableArray *)searchResultArray{
if (!_searchResultArray) {
_searchResultArray = [NSMutableArray array];
}
return _searchResultArray;
}
-(NSMutableArray *)modelArray{
if (!_modelArray) {
_modelArray = [NSMutableArray array];
PredicateModel *modelOne = [PredicateModel new];
modelOne.name = @"lili";
modelOne.address = @"bj";
modelOne.major = @"Chinese";
modelOne.age = 10;
[_modelArray addObject:modelOne];
//
PredicateModel *modelTwo = [PredicateModel new];
modelTwo.name = @"meimei";
modelTwo.address = @"sjz";
modelTwo.major = @"math";
modelTwo.age = 20;
[_modelArray addObject:modelTwo];
//
PredicateModel *modelThree = [PredicateModel new];
modelThree.name = @"lilei";
modelThree.address = @"sz";
modelThree.major = @"music";
modelThree.age = 15;
[_modelArray addObject:modelThree];
}
return _modelArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
//1.对NSArray过滤
NSArray *oneArray =[self getStringArrayFromStringArray];
//2.判断手机号
BOOL isPhoneNum = [self isMobileNumber:@"15110244530"];
//3.取两个数组的交集:
NSArray *threeArray = [self getJiaoJiArray];
//4.从数值型元素中选取某范围内的数值元素,并组成新的数组
NSArray *fourArray = [self getNumArrayFromNumArray];
//5.从数值数组中取某个元素
NSArray *fiveArray = [self getSomeOneFromNumArray];
//6.取包含某个字符的元素组成的数组
NSArray *sixArray = [self getArrayContainsOneCharactar];
//7.取以某字符开头的元素组成的数组
NSArray *sevenArray = [self getArrayBeginsWithOneCharactar];
//8.取以某字符结尾的元素组成的数组
NSArray *eigthArray = [self getArrayEndWithOneCharactar];
//=============多条件查询
//9.选取name字段包含me,major字段包含mu的新模型数组
NSArray *nineArray = [self getNewModelArray];
//10.名字包含m,l字符的,age在15~20之间的
NSArray *tenArray = [self getNewAnotherArray];
//11.name字段以ei结尾的
NSArray *elevenArray = [self modelContainsSomeChaArray];
//12.name为meimei,age<20的
NSArray *twelveArray = [self modelNameAndAge];
//?代表一个字符,下面的查询条件是:name中第二个字符是s的 不好使呢
// predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];
}
-(NSArray *)modelNameAndAge{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = 'meimei' && age <= 20"];
NSArray *array = [self.modelArray filteredArrayUsingPredicate:predicate];
return array;
}
-(NSArray *)modelContainsSomeChaArray{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name endswith 'ei'"];//endswith 不区分大小写
NSArray *aaray = [self.modelArray filteredArrayUsingPredicate:predicate];
return aaray;
}
-(NSArray *)getNewAnotherArray{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name in {'m','l'} || self.age in{15,20}"];//in包含
NSArray *ss = [self.modelArray filteredArrayUsingPredicate:predicate];
return ss;
}
-(NSArray *)getNewModelArray{
NSString *searchString = @"mu";
if (self.searchResultArray != nil) {
[self.searchResultArray removeAllObjects];
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name CONTAINS[x] %@ || SELF.major CONTAINS[s] %@",@"me",searchString];
self.searchResultArray = [[self.modelArray filteredArrayUsingPredicate:predicate] mutableCopy];
return [self.searchResultArray copy];
}
-(NSArray *)getArrayEndWithOneCharactar{
NSArray *array = @[@"lili",@"lucy",@"dali",@"babi",@"mami"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF ENDSWITH[d] 'cy'"];//d不区分大小写,且任意字符都可以;SELF不区分大小写
NSArray *temp = [array filteredArrayUsingPredicate:predicate];
return temp;
}
-(NSArray *)getArrayBeginsWithOneCharactar{
NSArray *array = @[@"lili",@"lucy",@"dali",@"babi",@"mami"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[k] 'd'"];//d不区分大小写 []里写任意字符,注意是字符
NSArray *temp = [array filteredArrayUsingPredicate:predicate];
return temp;
}
-(NSArray *)getArrayContainsOneCharactar{
NSArray *array = @[@"lili",@"Lucy",@"dali",@"babi",@"mami"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] '*l*' "];
//[NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] 'L'"];//L不区分大小写
NSArray *temp = [array filteredArrayUsingPredicate:predicate];
return temp;
}
-(NSArray *)getSomeOneFromNumArray{
NSArray *oneArray = @[@100,@12,@2,@12,@9];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF ==6"];
NSArray *newArray = [oneArray filteredArrayUsingPredicate:predicate];
NSLog(@"newArray:%@",newArray);
return newArray;
}
-(NSArray *)getNumArrayFromNumArray{
NSArray *array4 = [NSArray arrayWithObjects:@100,@20,@2,@4,@4,@6, nil];
NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,20}"];
NSArray *newArray4 = [array4 filteredArrayUsingPredicate:predicate4];
return array4;
}
-(NSArray *)getJiaoJiArray{
NSArray *oneArray = @[@"a",@"b",@"c",@"d"];
NSArray *twoArray = @[@"e",@"f",@"a",@"g"];
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"SELF in%@",twoArray];//SELF代表本身in可大写可小写
NSArray *jiaoJiArray = [oneArray filteredArrayUsingPredicate:predicate3];//获取交集
NSLog(@"%@",jiaoJiArray);
return jiaoJiArray;
}
-(NSArray *)getStringArrayFromStringArray{
NSArray *array = [[NSArray alloc] initWithObjects:@"beijing",@"shanghai",@"guangzhou",@"wuhan", nil];
NSString *string = @"ang";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@",string];
NSArray *newArray = [array filteredArrayUsingPredicate:pred];
NSLog(@"newArray:%@",newArray);
return newArray;
}
//正则判断手机号码地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum
{
/**
* 手机号码
* 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
10 * 中国移动:China Mobile
11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
/**
15 * 中国联通:China Unicom
16 * 130,131,132,152,155,156,185,186
17 */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
20 * 中国电信:China Telecom
21 * 133,1349,153,180,189
22 */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
25 * 大陆地区固话及小灵通
26 * 区号:010,020,021,022,023,024,025,027,028,029
27 * 号码:七位或八位
28 */
// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES))
{
if([regextestcm evaluateWithObject:mobileNum] == YES) {
NSLog(@"China Mobile");
} else if([regextestct evaluateWithObject:mobileNum] == YES) {
NSLog(@"China Telecom");
} else if ([regextestcu evaluateWithObject:mobileNum] == YES) {
NSLog(@"China Unicom");
} else {
NSLog(@"Unknow");
}
return YES;
}
else
{
return NO;
}
}
@end