在IOS开发Cocoa框架中提供了一个功能强大的类NSPredicate,下面来讨论一下它的强大之处在哪...
NSPredicate继承自NSObject,它有两个派生的子类
• NSComparisonPredicate
• NSCompoundPredicate (子类不是我们今天讨论的对象,暂且了解一下就行)
 说到谓词,我们先来看一下谓词的语法。
1.比较运算符
* >:大于
* <:小于
* >=:大于等于
* <=:小于等于
* =,==:等于
* !=,<>:不等于

2.逻辑运算符
   *and /&&和
   *or/||或
   *not/!非
3.关系运算符
   *ANY任意,SOME 一些
    *ALL所有元素
    *NONE没有元素 等同于not any
    *in包含
4.范围运算符
* between 如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。
* in包含

4.字符串本身
   *SELF 如:@“self==‘APPLEIOS’”
5.字符串相关
   *contain
    *between
    *endswith
6.like通配符
   * like 如:@"name like[cd] '*ios*'"  
                 @"name" like[cd] 'ios*'"
7.正则表达式matches
     *如:NSString *regex = @"^A.+e$";   //以A开头,e结尾
        @"name MATCHES %@",regex
8.数组操作
       * array[index]:指定数组中特定索引处的元素。
       *array[first]:制定第一个元素
        *array[last]:制定最后一个元素
        *array[size]:制定数组大小
下面我们再来看一下具体的事例:

新建一个项目,然后添加类products

Products.h
 1 //
2 // Products.h
3 // NSPredicateTest
4 //
5 // Created by xuhongjiang on 15/10/27.
6 // Copyright (c) 2015年 xuhongjiang. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10
11 @interface Products : NSObject
12 @property NSString *productName;
13 @property NSInteger productCount;
14 @property NSString *productImageUrl;
15 +(id)initProductWithName:(NSString *) name withCount:(NSInteger) count withImage:(NSString *) imageurl;
16 @end
Products.m
 1 //
2 // Products.m
3 // NSPredicateTest
4 //
5 // Created by xuhongjiang on 15/10/27.
6 // Copyright (c) 2015年 xuhongjiang. All rights reserved.
7 //
8
9 #import "Products.h"
10
11 @implementation Products
12 +(id)initProductWithName:(NSString *)name withCount:(NSInteger)count withImage:(NSString *)imageurl
13 {
14 Products *sprducts=[[Products alloc] init];
15 sprducts.productName=name;
16 sprducts.productCount=count;
17 sprducts.productImageUrl=imageurl;
18 return sprducts;
19 }
20 -(NSString *)description
21 {
22 NSString *str=[NSString stringWithFormat:@"产品名称:%@,数量:%ld,图片:%@",_productName,_productCount,_productImageUrl];
23 return str;
24 }
25 @end

测试方法:

  1 //
2 // ViewController.m
3 // NSPredicateTest
4 //
5 // Created by xuhongjiang on 15/10/27.
6 // Copyright (c) 2015年 xuhongjiang. All rights reserved.
7 //
8
9 #import "ViewController.h"
10 #import "Products.h"
11
12 @interface ViewController ()
13
14 @end
15
16 @implementation ViewController
17
18 - (void)viewDidLoad {
19 [super viewDidLoad];
20 [self mainTest];
21 }
22
23 - (void)didReceiveMemoryWarning {
24 [super didReceiveMemoryWarning];
25 }
26
27 -(void) mainTest
28 {
29 Products *p1=[Products initProductWithName:@"A苹果sdasf" withCount:2 withImage:@"464.jpg"];
30 Products *p2=[Products initProductWithName:@"fsdf橘子gag" withCount:53 withImage:@"fsdfas.jpg"];
31 Products *p3=[Products initProductWithName:@"dfgdf香蕉" withCount:5 withImage:@"sfas.jpg"];
32 Products *p4=[Products initProductWithName:@"三星" withCount:76 withImage:@"ggas.jpg"];
33 Products *p5=[Products initProductWithName:@"华为dfsd" withCount:9 withImage:@"gasa.jpg"];
34 Products *p6=[Products initProductWithName:@"微软dhnnne" withCount:6 withImage:@"hshhh.jpg"];
35 Products *p7=[Products initProductWithName:@"三星" withCount:6 withImage:@"hshhh.jpg"];
36 Products *p8=[Products initProductWithName:@"15300250500" withCount:6 withImage:@"hshhh.jpg"];
37
38 NSArray *sproducts=[NSArray arrayWithObjects:p1,p2,p3,p4,p5,p6,p7,nil];
39
40 //数量小于9 定义谓词 包含过滤条件
41 NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",9];
42 //过滤结果返回新的数组
43 NSArray *newArray=[sproducts filteredArrayUsingPredicate:prdicate];
44 for (Products *item in newArray) {
45 NSLog(@"newArray=%@",item.productName);
46 }
47
48
49 //数量大于9 并且productname等于“三星jfggg” 定义谓词 包含过滤条件
50 prdicate=[NSPredicate predicateWithFormat:@"productName='三星' && productCount>9"];
51 //过滤结果返回新的数组
52 newArray=[sproducts filteredArrayUsingPredicate:prdicate];
53 for (Products *item in newArray) {
54 NSLog(@"newArray=%@",item.productName);
55 }
56
57 //in(包含) *注意 包含是全字匹配
58 prdicate = [NSPredicate predicateWithFormat:@"productName IN {'g','华为','三星'}||productCount IN {2,5}"];
59 //过滤结果返回新的数组
60 newArray=[sproducts filteredArrayUsingPredicate:prdicate];
61 for (Products *item in newArray) {
62 NSLog(@"newArray=%@",item.productName);
63 }
64
65
66 //productName以a开头的
67 prdicate = [NSPredicate predicateWithFormat:@"productName BEGINSWITH 'A'"];
68 //productName以ba结尾的
69 prdicate = [NSPredicate predicateWithFormat:@"productName ENDSWITH 'g'"];
70
71 //name中包含字符a的
72 prdicate = [NSPredicate predicateWithFormat:@"productName CONTAINS 'a'"];
73
74 //like 匹配任意多个字符
75 //productName中只要有s字符就满足条件
76 prdicate = [NSPredicate predicateWithFormat:@"productName like '*s*'"];
77 //?代表一个字符,下面的查询条件是:name中第二个字符是s的
78 prdicate = [NSPredicate predicateWithFormat:@"productName like '?s*'"];
79
80 newArray=[sproducts filteredArrayUsingPredicate:prdicate];
81 for (Products *item in newArray) {
82 NSLog(@"newArray=%@",item.productName);
83 }
84
85 //正则表达式 验证是否是手机号
86 BOOL isMobileNum=[self isMobileNumber:p8.productName];
87 if(isMobileNum)
88 NSLog(@"是真确的手机号:%@",p8.productName);
89
90 }
91
92
93 - (BOOL)isMobileNumber:(NSString *)mobileNum
94 {
95 /**
96 * 手机号码
97 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
98 * 联通:130,131,132,152,155,156,185,186
99 * 电信:133,1349,153,180,189
100 */
101 NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
102 /**
103 10 * 中国移动:China Mobile
104 11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
105 12 */
106 NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
107 /**
108 15 * 中国联通:China Unicom
109 16 * 130,131,132,152,155,156,185,186
110 17 */
111 NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
112 /**
113 20 * 中国电信:China Telecom
114 21 * 133,1349,153,180,189
115 22 */
116 NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
117 /**
118 25 * 大陆地区固话及小灵通
119 26 * 区号:010,020,021,022,023,024,025,027,028,029
120 27 * 号码:七位或八位
121 28 */
122 // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
123
124 NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
125 NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
126 NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
127 NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
128
129 if (([regextestmobile evaluateWithObject:mobileNum] == YES)
130 || ([regextestcm evaluateWithObject:mobileNum] == YES)
131 || ([regextestct evaluateWithObject:mobileNum] == YES)
132 || ([regextestcu evaluateWithObject:mobileNum] == YES))
133 {
134 if([regextestcm evaluateWithObject:mobileNum] == YES) {
135 NSLog(@"中国移动");
136 } else if([regextestct evaluateWithObject:mobileNum] == YES) {
137 NSLog(@"联通");
138 } else if ([regextestcu evaluateWithObject:mobileNum] == YES) {
139 NSLog(@"电信");
140 } else {
141 NSLog(@"Unknow");
142 }
143
144 return YES;
145 }
146 else
147 {
148 return NO;
149 }
150 }
151 @end

1.查询产品数量小于9的产品

这里的代码很简单,第一步创建一个过滤器,用占位符替换数量9,过滤器返回一个新的数组,之后遍历数组,只取产品名称。

//数量小于9  定义谓词 包含过滤条件
NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",9];
//过滤结果返回新的数组
NSArray *newArray=[sproducts filteredArrayUsingPredicate:prdicate];
for (Products *item in newArray) {
NSLog(@"newArray=%@",item.productName);
}

2.查询数量大于9 并且productname等于“三星jfggg”的产品

//数量大于9 并且productname等于“三星jfggg” 定义谓词 包含过滤条件
prdicate=[NSPredicate predicateWithFormat:@"productName='三星' && productCount>9"];
//过滤结果返回新的数组
newArray=[sproducts filteredArrayUsingPredicate:prdicate];

3.in包含  (*注 包含是全字匹配)

prdicate = [NSPredicate predicateWithFormat:@"productName IN {'g','华为','三星'}||productCount IN {2,5}"];
//过滤结果返回新的数组
newArray=[sproducts filteredArrayUsingPredicate:prdicate];

4.字符串相关处理

//productName以a开头的
prdicate = [NSPredicate predicateWithFormat:@"productName BEGINSWITH 'A'"];
//productName以ba结尾的
prdicate = [NSPredicate predicateWithFormat:@"productName ENDSWITH 'g'"]; //name中包含字符a的
prdicate = [NSPredicate predicateWithFormat:@"productName CONTAINS 'a'"];

5.like通配符,用于模糊查询

 //like 匹配任意多个字符
//productName中只要有s字符就满足条件
prdicate = [NSPredicate predicateWithFormat:@"productName like '*s*'"];
//?代表一个字符,下面的查询条件是:name中第二个字符是s的
prdicate = [NSPredicate predicateWithFormat:@"productName like '?s*'"]; newArray=[sproducts filteredArrayUsingPredicate:prdicate];

6.正则表达式,例子是验证是否是手机号

//正则表达式串
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
//创建含有正则表达式的帅选器
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
//筛选器的evaluateWithObject方法反向验证是否手机号,返回bool值
BOOL isPhoneNum=[regextestmobile evaluateWithObject:@"15300250500"] ;

关于谓词的使用,我们只列举了几个常见的用法,它还有很多种灵活的用法,如对时间datetime的间隔筛选、谓词变量 ”谓词==$变量名“等,待有时间希望大家去研究。

转自:https://www.cnblogs.com/hj2xx2hj/p/4915159.html

NSPredicate谓词的用法的更多相关文章

  1. IOS开发之NSPredicate谓词的用法

    编程的人员不管是上过大学还是从培训机构出来的或做后台的.前端的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现 ...

  2. objective-c中使用cocoa的NSPredicate,谓词(十四)

    holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details ...

  3. NSPredicate谓词

    NSPredicate——谓词(is) 作用:判断条件表达式的求值返回真或假的过程 使用步骤: . 定义NSPredicate对象并指定条件 . 调用谓词的evaluateWithObject方法判断 ...

  4. NSPredicate,谓词

    原文地址:http://blog.csdn.net/holydancer/article/details/7380799 在语言上,谓语,谓词是用来判断的,比如“我是程序猿”中的是,就是表判断的谓语, ...

  5. NSPredicate 谓词总结 数组过滤 模糊匹配

    NSPredicate 用于指定过滤条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配. NSPredicate常用方法介绍 1.创建NSPredicate(相当于创建一个过滤条件 ...

  6. NSPredicate谓词查询

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...

  7. SQL进阶系列之8EXISTS谓词的用法

    写在前面 支撑SQL和关系数据库的基础理论:数学领域的集合论和逻辑学标准体系的谓词逻辑 理论篇 什么是谓词?谓词是返回值为真值(true false unknown)的函数 关系数据库里,每一个行数据 ...

  8. iOS数组使用

    相关链接: ios数组基本用法和排序 NSArray 排序汇总 iOS 数组排序方法 IOS-筛选数组内的元素 关于EnumerateObjectsUsingBlock和for-in之间的较量 [iO ...

  9. iOS中的谓词(NSPredicate)使用

    http://www.cocoachina.com/ios/20160111/14926.html 首先,我们需要知道何谓谓词,让我们看看官方的解释: The NSPredicate class is ...

随机推荐

  1. SpringBoot中获取spring.profiles.active的值

    一.网上很多采用@Profile("dev")的方式获取,但是这个是类级别的 二.开发中可能需要代码级别 1.刚开始我想通过classpath下的文件读取方式,麻烦死了,于是换了个 ...

  2. paramiko模块实现远程传输控制

    一.什么是paramiko呢? paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的parami ...

  3. 在eclipse导入项目的步骤

    1. Import 2. Next 3. 确定  选中copy projects into workspace    Finish 这样项目就导入进来了. 4.导入jar包 Configure Bui ...

  4. Objective-C 之Extension

    Objective-C 之Extension class extension:类扩展 类扩展与 category 有相似性,但在编译时它只能被添加到已有源代码的一类中(该类扩展和该类同时被编译). 在 ...

  5. Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh

    上一篇文章讲了SpringCloudConfig 集成Git仓库,配和 Eureka 注册中心一起使用,但是我们会发现,修改了Git仓库的配置后,需要重启服务,才可以得到最新的配置,这一篇我们尝试使用 ...

  6. 原创js脚本实现百度网盘任意文件强制下载

    代码: //get file list data var data=require("system-core:context/context.js").instanceForSys ...

  7. JavaSpring【四、Bean管理注解实现】

    前面讲的Bean相关配置全部是使用xml配置文件或实现接口来实现的,接下来将比较常用的用法,使用注解实现bean的注入和管理 内容包括 ClassPath扫描与组件管理 类的自动检测与注册bean c ...

  8. 第2章 python入门

    基本数据类型(int, bool, str) 1.1 python基本数据类型 1.int ==> 整数. 主要⽤来进⾏数学运算 2.str ==> 字符串 可以保存少量数据并进⾏相应的操 ...

  9. 「SNOI2019」通信 分治建图

    根据题意 每个点可以直接与S,T相连 也可以和前面的哨站相连 暴力建边的话 有n2条边 要用分治优化建边: 类似于归并排序 先对每一层分为左半边与右半边 对每一半都拿出来先排序去重后 直接排成一条链建 ...

  10. Java反射的使用

    反射的概述 1.Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 2.对于任意一个对象,都能调用它的任意一个方法和属性. 3.通过动态获取的信息以及动态调用对象的方法 ...