前言:
本篇博客,不在用太多的语言介绍,因为,介绍已经添加到代码中。现在。我们就直接上代码。如果,有不对的地方还请海涵。
第一、主代码:
//
// ViewController.m
// iOS的谓词
//
// Created by MAC on 16/7/20.
// Copyright © 2016年 NetworkCode小贱. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
typedef NSPredicate TP;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 谓词的语法
/*
@谓词的等于语法。
=、== (等价)
解释:@"A = B" Or @"A == B" 是等式的左边等于右边
*/
/*
1、 等于
=, ==
The left-hand expression is equal to the right-hand expression.
2、 大于等于
>=, =>
The left-hand expression is greater than or equal to the right-hand expression.
3、小于等于
<=, =<
The left-hand expression is less than or equal to the right-hand expression.
4、大于
>
The left-hand expression is greater than the right-hand expression.
5、小于
<
The left-hand expression is less than the right-hand expression.
6、不等于
!=, <>
The left-hand expression is not equal to the right-hand expression.
7、之间
BETWEEN
The left-hand expression is between, or equal to either of, the values specified in the right-hand side.
*/
/**********************************************************/
NSArray * NumberCount = @[@10,@250,@100];
// TP * ZP = [TP predicateWithFormat:@"SELF = 250"];
TP * ZP = [TP predicateWithFormat:@"SELF == 250"];
NSArray * ResultA = [NumberCount filteredArrayUsingPredicate:ZP];
NSLog(@"%@",ResultA);
/*
输出的结果:
2016-07-20 12:01:53.895 iOS的谓词[9688:610934] (
250
)
*/
/**********************************************************/
NSString * NumberString = @"100";
// TP * ZP1 = [TP predicateWithFormat:@"SELF = 100"];
TP * ZP1 = [TP predicateWithFormat:@"SELF = '100'"];
BOOL IS = [ZP1 evaluateWithObject:NumberString];
NSLog(@"%d",IS);
/*
输出的结果:
2016-07-20 12:15:30.673 iOS的谓词[9795:642116] 0
// ****8
@"SELF = 100" 这种写法是不对的,得不到你想要的结果。
@"SELF = '100'" 这种写法是可以的。
@
*/
/**********************************************************/
NSArray * Number = @[@10,@250,@100];
// TP * ZP = [TP predicateWithFormat:@"SELF = 250"];
TP * ZPT = [TP predicateWithFormat:@"SELF >20",@"SELF <350"];
NSArray * ResultB = [Number filteredArrayUsingPredicate:ZPT];
NSLog(@"%@",ResultB);
/*输出:
2016-07-20 13:08:48.539 iOS的谓词[9923:693447] (
250,
100
)
*/
/**********************************************************/
NSArray * NumberN = @[@10,@10,@100];
// TP * ZPN = [TP predicateWithFormat:@"SELF != 10"];
TP * ZPN = [TP predicateWithFormat:@"SELF <> 10"];
NSArray * ResultN = [NumberN filteredArrayUsingPredicate:ZPN];
NSLog(@"%@",ResultN);
/*
输出:
2016-07-20 13:18:57.888 iOS的谓词[10001:725480] (
100
)
*/
/**********************************************************/
NSArray * NumberBt = @[@10,@16,@200];
// TP * ZPN = [TP predicateWithFormat:@"SELF != 10"];
TP * ZPBt = [TP predicateWithFormat:@"SELF BETWEEN {10,200}"];
NSArray * ResultBt = [NumberBt filteredArrayUsingPredicate:ZPBt];
NSLog(@"%@",ResultBt);
/*
输出:
2016-07-20 13:37:04.110 iOS的谓词[10236:814634] (
10,
16,
200
)
注释:BETWEEN 是区间,范围是:小于等于最大的,大于等于最小的。
@"SELF BETWEEN {10,200}" 等价于 @"SELF >=10 && SELF <=200"
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 逻辑谓词语法
/*
1、与
AND, &&
Logical AND.
2、或
OR, ||
Logical OR.
3、非
NOT, !
Logical NOT.
*/
/**********************************************************/
NSArray * NumberL = @[@10,@16,@200];
// TP * ZPN = [TP predicateWithFormat:@"SELF != 10"];
TP * ZPL = [TP predicateWithFormat:@"SELF < 100 OR SELF > 10"];
NSArray * ResultL = [NumberL filteredArrayUsingPredicate:ZPL];
NSLog(@"%@",ResultL);
/*
输出:
2016-07-20 13:58:46.985 iOS的谓词[10419:894174] (
10,
16,
200
)
*/
/**********************************************************/
NSArray * NumberM = @[@10,@16,@200];
// TP * ZPN = [TP predicateWithFormat:@"SELF != 10"];
TP * ZPM = [TP predicateWithFormat:@"SELF < 10 || SELF > 16"];
NSArray * ResultM = [NumberM filteredArrayUsingPredicate:ZPM];
NSLog(@"%@",ResultM);
/*
输出:
2016-07-20 14:03:26.189 iOS的谓词[10473:915512] (
200
)
*/
/**********************************************************/
NSArray * NumberC = @[@10,@16,@200];
// TP * ZPMC = [TP predicateWithFormat:@"SELF < 100 AND SELF > 10"];
TP * ZPMC = [TP predicateWithFormat:@"SELF < 100 && SELF > 10"];
NSArray * ResultML = [NumberC filteredArrayUsingPredicate:ZPMC];
NSLog(@"%@",ResultML);
/*
输出:
2016-07-20 14:06:21.696 iOS的谓词[10502:931425] (
16
)
*/
/**********************************************************/
NSArray * NumberNO = @[@10,@16,@200];
TP * ZPNO = [TP predicateWithFormat:@" NOT(SELF>16) || !(SELF<16)"];
NSArray * ResultNO = [NumberNO filteredArrayUsingPredicate:ZPNO];
NSLog(@"%@",ResultNO);
/*
输出结果:
2016-07-21 09:04:52.470 iOS的谓词[826:91468] (
10,
16,
200
)
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 字符串筛选的语法
/*
1、字符串是否以什么开头
BEGINSWITH
The left-hand expression begins with the right-hand expression.
2、字符串包含
CONTAINS
The left-hand expression contains the right-hand expression.
3、字符串以什么结尾
ENDSWITH
The left-hand expression ends with the right-hand expression.
4、谓词的模糊查询
LIKE
The left hand expression equals the right-hand expression: ? and * are allowed as wildcard characters, where ? matches 1 character and * matches 0 or more characters.
5、正则表达式的筛选
MATCHES
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 (for more details see the ICU User Guide for Regular Expressions).
6、判断两个是否相等
UTI-EQUALS
The left hand argument to this operator is an expression that evaluates to a universal type identifier (UTI) you want to match. The right hand argument is an expression that evaluates to a UTI. The comparison evaluates to TRUE if the UTI returned by the left hand expression equals the UTI returned by the right hand expression.
*/
/***********************************************/
NSArray * NumberCA = @[@"zhonghua",@"beijing",@"henan"];
TP * ZPCA = [TP predicateWithFormat:@"self BEGINSWITH 'z' || self BEGINSWITH 'h'"];
NSArray * ResultCA = [NumberCA filteredArrayUsingPredicate:ZPCA];
NSLog(@"%@",ResultCA);
/*
输出结果:
2016-07-21 09:14:25.281 iOS的谓词[905:115420] (
zhonghua,
henan
)
*/
/***********************************************/
NSArray * NumberContains = @[@"zhonghua",@"beijing",@"henan"];
TP * ZPContains = [TP predicateWithFormat:@"self CONTAINS 'an' || self CONTAINS 'on'"];
NSArray * ResultContains = [NumberContains filteredArrayUsingPredicate:ZPContains];
NSLog(@"%@",ResultContains);
/*
输出:
2016-07-21 09:22:44.623 iOS的谓词[1075:148670] (
zhonghua,
henan
)
*/
/***********************************************/
NSArray * NumberCEnd = @[@"zhonghua",@"beijing",@"henan"];
TP * ZPCEnd = [TP predicateWithFormat:@"self ENDSWITH 'g' || self ENDSWITH 'n'"];
NSArray * ResultCEnd = [NumberCEnd filteredArrayUsingPredicate:ZPCEnd];
NSLog(@"%@",ResultCEnd);
/*
输出:
2016-07-21 09:25:14.564 iOS的谓词[1103:160081] (
beijing,
henan
)
*/
/***********************************************/
NSArray * NumberCLike = @[@"zhonghua",@"beijing",@"henan"];
TP * ZPCLike = [TP predicateWithFormat:@"self LIKE '*g' || self LIKE '*n'"];
NSArray * ResultCLike = [NumberCLike filteredArrayUsingPredicate:ZPCLike];
NSLog(@"%@",ResultCLike);
/*
输出:
2016-07-21 09:36:29.632 iOS的谓词[1148:173842] (
beijing,
henan
)
*/
/***********************************************/
NSString * NumberCString = @"18811520397";
TP * ZPMATCHES = [TP predicateWithFormat:@"self MATCHES %@",@"^1[3|4|5|7|8][0-9]\\d{8}$"];
BOOL ResultMATCHES= [ZPMATCHES evaluateWithObject:NumberCString];
NSLog(@"%d",ResultMATCHES);
/*
输出:
2016-07-21 10:09:31.577 iOS的谓词[1281:258855] 1
*/
/*
注意:@"self MATCHES '^1[3|4|5|7|8][0-9]\\d{8}$'" 这样的写法是错的,语法是不错的。这样写得不到我们想要的结果。
*/
/***********************************************/
NSString * NumberUIT = @"18";
TP * ZPUIT = [TP predicateWithFormat:@"self UTI-EQUALS '18'"];
BOOL ResultUIT= [ZPUIT evaluateWithObject:NumberUIT];
NSLog(@"%d",ResultUIT);
/*
输出:
2016-07-21 10:44:34.285 iOS的谓词[1462:351511] 1
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 谓词集合语法
/*
1、一些、任意
ANY, SOME
Specifies any of the elements in the following expression. For example ANY children.age < 18.
2、所有
ALL
Specifies all of the elements in the following expression. For example ALL children.age < 18.
3、逻辑非
NONE
Specifies none of the elements in the following expression. For example, NONE children.age < 18. This is logically equivalent to NOT (ANY ...).
4、交集
IN
Equivalent to an SQL IN operation, the left-hand side must appear in the collection specified by the right-hand side.
*/
/***********************************************/
NSArray *words = @[
@[@10, @20],
@[@10, @50, @100],
@[@10, @60]
];
//TP * ZPANY = [TP predicateWithFormat:@"ANY SELF == %@",@10]; // 等价于
TP * ZPANY = [TP predicateWithFormat:@"SOME SELF == %@",@10];
NSArray * ResultANY= [words filteredArrayUsingPredicate:ZPANY];
NSLog(@"%@",ResultANY);
/*
输出:
2016-07-21 13:38:16.948 iOS的谓词[1978:511518] (
(
10,
20
),
(
10,
50,
100
),
(
10,
60
)
)
注释: ALL和AND/SOME 用法一样
*/
/***********************************************/
NSArray *Numberwords = @[
@[@10, @20],
@[@10, @50, @100],
@[@10, @60]
];
// TP * ZPNONE = [TP predicateWithFormat:@"NONE SELF == %@",@50];// 等价于
TP * ZPNONE = [TP predicateWithFormat:@"NONE SELF == 50"];
NSArray * ResultNONE= [Numberwords filteredArrayUsingPredicate:ZPNONE];
NSLog(@"%@",ResultNONE);
/*
输出:
2016-07-21 13:50:22.578 iOS的谓词[2086:547199] (
(
10,
20
),
(
10,
60
)
)
注释:
@"NONE SELF == %d",@50 这样的写法是错误的。结果是全部ALL。
*/
/***********************************************/
NSArray *NumberIN = @[
@[@10, @20],
@[@10, @50, @100],
@[@10, @60]
];
TP * ZPIN = [TP predicateWithFormat:@"ALL SELF IN %@",@[@10,@60]];
//TP * ZPIN = [TP predicateWithFormat:@" SELF IN %@",@[@10,@60]]; // 错误
NSArray * ResultIN= [NumberIN filteredArrayUsingPredicate:ZPIN];
NSLog(@"%@",ResultIN);
/*
输出:
2016-07-21 14:04:41.829 iOS的谓词[2270:602269] (
(
10,
60
)
)
注释:
@" SELF IN %@",@[@10,@60] 是错误的得不到我们想要的结果。
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 一些谓词关键词意思
/*
1、 假
FALSE, NO
Logical false.
2、真
TRUE, YES
Logical true.
3、空
NULL, NIL
A null value.
4、对象本身
SELF
Represents the object being evaluated.
5、字符串
"text"
A character string.
'text'
A character string.
6、数组(谓词中)
Comma-separated literal array
For example, { 'comma', 'separated', 'literal', 'array' }.
7.浮点数
Standard integer and fixed-point notations
For example, 1, 27, 2.71828, 19.75.
Floating-point notation with exponentiation
8、e函数
For example, 9.2e-5.
9、十六进制
0x
Prefix used to denote a hexadecimal digit sequence.
10、八进制
0o
Prefix used to denote an octal digit sequence.
11、二进制
0b
Prefix used to denote a binary digit sequence.
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 所有关键词
/*
AND(与), OR(或), IN(交集), NOT(非), ALL(所有), (ANY, SOME)(指定区域), NONE(补集), LIKE(模糊匹配), CASEINSENSITIVE, CI, MATCHES(正则), CONTAINS(包含),
BEGINSWITH(以什么开头), ENDSWITH(以什么结尾), BETWEEN(在什么什么之间), (NULL, NIL)(空对象), SELF(对象本身), (TRUE, YES)(真), (FALSE, NO)(假), FIRST(第一), LAST(最后),
SIZE(大小), ANYKEY(。。。), SUBQUERY, CAST, TRUEPREDICATE(返回为真得谓词), FALSEPREDICATE(返回为假的谓词), UTI-CONFORMS-TO, UTI-EQUALS(等于)
*/
/***********************************************/
/****************************************/
/**********************************/
/****************************/
//NSPredicate 的一些方法解释
/*
第一个方法:
+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...;
*/
NSArray * CityNameArray = @[@[@"henam",@"beijing"],@[@"xian"],@[@"qinghai",@"xuchang",@"luhe"],@[@"kaifeng"]];
NSArray * CityNameArray2 = @[@[@"henan",@"heibie"],@[@"xiangtai"],@[@"qinghaihu",@"xuchangshi",@"luhe"],@[@"kaifengfu"]];
// 模糊匹配
TP * MoHu = [TP predicateWithFormat:@"ANY SELF CONTAINS %@",@"henam"];
NSArray * MoHuARRay = [CityNameArray filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",MoHuARRay);
/*
输出:
2016-07-21 14:58:36.400 iOS的谓词[2604:764411] (
(
henam,
beijing
)
)
*/
// 精确匹配
MoHu = [TP predicateWithFormat:@"ANY SELF IN %@",@"luhe"];
NSArray * JingQueA = [CityNameArray filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",JingQueA);
/*
输出:
2016-07-21 15:01:09.683 iOS的谓词[2643:776525] (
(
qinghai,
xuchang,
luhe
)
)
*/
// 多个匹配
MoHu = [TP predicateWithFormat:@"ANY SELF IN %@",@[@"henan",@"beijing"]];
NSArray * JingQueM = [CityNameArray filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",JingQueM);
/*
输出:
2016-07-21 15:03:20.953 iOS的谓词[2689:787869] (
(
henam,
beijing
)
)
*/
// 不包含某个字段的匹配
MoHu = [TP predicateWithFormat:@"NONE SELF CONTAINS %@",@"henan"];
NSArray * NOA = [CityNameArray filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",NOA);
/*
输出:
2016-07-21 15:05:00.479 iOS的谓词[2721:795366] (
(
xian
),
(
qinghai,
xuchang,
luhe
),
(
kaifeng
)
)
*/
//断言(嵌套数组是精确匹配)
MoHu = [TP predicateWithFormat:@"ANY %@ CONTAINS[cd] %@",CityNameArray2, @"henan"];
BOOL DY = [MoHu evaluateWithObject:CityNameArray2];
NSLog(@"%d",DY);
/*
输出:
2016-07-21 15:13:20.690 iOS的谓词[2872:831792] 1
*/
// 评估(单个数组的评估)
MoHu = [TP predicateWithFormat:@"ANY %@ CONTAINS[cd] %@",CityNameArray2[0], @"henan"];
BOOL SingolA = [MoHu evaluateWithObject:CityNameArray2];
NSLog(@"%d",SingolA);
/*
输出;
2016-07-21 15:21:03.686 iOS的谓词[2942:867601] 1
*/
/*
第二个方法:
+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat argumentArray:(nullable NSArray *)arguments;
*/
MoHu = [TP predicateWithFormat:@"ALL SELF IN %@" argumentArray:@[CityNameArray2.firstObject]];
NSArray * SingolAS = [CityNameArray2 filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",SingolAS);
/*
2016-07-21 15:28:10.374 iOS的谓词[3075:900294] (
(
henan,
heibie
)
)
注释:
MoHu = [TP predicateWithFormat:@"ALL SELF IN %@" argumentArray:CityNameArray2.firstObject]; 这种写法不对
*/
/*
第三个方法:
+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat arguments:(va_list)argList;
*/
[self predicateWithFormatArray:CityNameArray2 andArgList:@"h",@"n"];
/*
输出:
2016-07-21 15:44:58.286 iOS的谓词[3265:954041] (
(
henan,
heibie
),
(
xiangtai
),
(
qinghaihu,
xuchangshi,
luhe
),
(
kaifengfu
)
)
注意:
@"h",@"n" 是或的条件
*/
/*
第四个方法:
+ (NSPredicate *)predicateWithValue:(BOOL)value; // return predicates that always evaluate to true/false
*/
MoHu = [TP predicateWithValue:YES];
NSArray * SingolYES= [CityNameArray2 filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",SingolYES);
/*
2016-07-21 15:50:30.614 iOS的谓词[3314:975269] (
(
henan,
heibie
),
(
xiangtai
),
(
qinghaihu,
xuchangshi,
luhe
),
(
kaifengfu
)
)
注意: 这是一个一直返回真的谓词;还有一个NO,是一直返回假的谓词。
*/
/*
第五个方法:
+ (NSPredicate*)predicateWithBlock:(BOOL (^)(id evaluatedObject, NSDictionary<NSString *, id> * __nullable bindings))block NS_AVAILABLE(10_6, 4_0);
*/
MoHu = [TP predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
// 判断参数是否存在
if (bindings) {
return [[evaluatedObject objectAtIndex:0] isEqualToString:bindings[@"key"]];
}else{
return [[evaluatedObject objectAtIndex:0] isEqualToString:@"henan"];
}
}];
NSLog(@"%@",[MoHu predicateWithSubstitutionVariables:@{@"key":@"henan"}]);
NSArray * SingolBl= [CityNameArray2 filteredArrayUsingPredicate:MoHu];
NSLog(@"%@",SingolBl);
/*
第五个方法:
- (instancetype)predicateWithSubstitutionVariables:(NSDictionary<NSString *, id> *)variables; // substitute constant values for variables
*/
MoHu = [NSPredicate predicateWithFormat:@"ANY SELF IN $strVar"];
NSPredicate *subPre = [MoHu predicateWithSubstitutionVariables:@{@"strVar":@"henan"}];
NSLog(@"%@",[CityNameArray2 filteredArrayUsingPredicate:subPre]);
/*
输出:
2016-07-21 17:05:09.148 iOS的谓词[3560:1286820] (
(
henan,
heibie
)
)
*/
/*
可变数组的查询
*/
NSMutableArray * MutableArray = [NSMutableArray arrayWithObjects:@[@10,@20],@[@10,@80,@30], nil];
// 多个匹配
MoHu = [TP predicateWithFormat:@"ANY SELF IN %@",@[@10,@20]];
[MutableArray filterUsingPredicate:MoHu];
NSLog(@"%@",MutableArray);
/***********************************************/
/****************************************/
/**********************************/
/****************************/
// 其他方法和技巧
/*
动态属性名
假如你的代码如下
NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"];
显然代码没有任何问题,但是这个不是最好的写法我建议如下写法:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
这样看上去可能会让代码逻辑更清晰。
当过滤条件字段都是动态的时候
NSString *key = @"name";
NSString *value = @"name1";
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];
然后当你执行到第三行的时候代码就会报错!
逻辑上没错误啊!!!为什么会出错呢?
NSPredicate要自动添加引号,所以最后得到的格式应该是@"'name' = 'name1'"。明显不对。要做的就是:
NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", key, value];
*/
// Do any additional setup after loading the view, typically from a nib.
}
-(void)predicateWithFormatArray:(NSArray*)array andArgList:(NSString*)args, ...{
va_list MList ;
va_start(MList, args);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF CONTAINS %@" arguments:MList];
va_end(MList);
NSLog(@"%@",[array filteredArrayUsingPredicate:predicate]);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end