编程的人员不管是上过大学还是从培训机构出来的或做后台的、前端的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现了功能能和SQL语句相媲美的技术,它就是List泛型集合的Lambda表达式,支持查找、排序、比较、组合等.在java中虽然没有在语言中集成对List对象的操作的实现,但是第三方开源库同样实现了这一功能.在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
 //
// Products.h
// NSPredicateTest
//
// Created by xuhongjiang on 15/10/27.
// Copyright (c) 2015年 xuhongjiang. All rights reserved.
// #import <Foundation/Foundation.h> @interface Products : NSObject
@property NSString *productName;
@property NSInteger productCount;
@property NSString *productImageUrl;
+(id)initProductWithName:(NSString *) name withCount:(NSInteger) count withImage:(NSString *) imageurl;
@end
Products.m
 //
// Products.m
// NSPredicateTest
//
// Created by xuhongjiang on 15/10/27.
// Copyright (c) 2015年 xuhongjiang. All rights reserved.
// #import "Products.h" @implementation Products
+(id)initProductWithName:(NSString *)name withCount:(NSInteger)count withImage:(NSString *)imageurl
{
Products *sprducts=[[Products alloc] init];
sprducts.productName=name;
sprducts.productCount=count;
sprducts.productImageUrl=imageurl;
return sprducts;
}
-(NSString *)description
{
NSString *str=[NSString stringWithFormat:@"产品名称:%@,数量:%ld,图片:%@",_productName,_productCount,_productImageUrl];
return str;
}
@end

测试方法:

 //
// ViewController.m
// NSPredicateTest
//
// Created by xuhongjiang on 15/10/27.
// Copyright (c) 2015年 xuhongjiang. All rights reserved.
// #import "ViewController.h"
#import "Products.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self mainTest];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} -(void) mainTest
{
Products *p1=[Products initProductWithName:@"A苹果sdasf" withCount: withImage:@"464.jpg"];
Products *p2=[Products initProductWithName:@"fsdf橘子gag" withCount: withImage:@"fsdfas.jpg"];
Products *p3=[Products initProductWithName:@"dfgdf香蕉" withCount: withImage:@"sfas.jpg"];
Products *p4=[Products initProductWithName:@"三星" withCount: withImage:@"ggas.jpg"];
Products *p5=[Products initProductWithName:@"华为dfsd" withCount: withImage:@"gasa.jpg"];
Products *p6=[Products initProductWithName:@"微软dhnnne" withCount: withImage:@"hshhh.jpg"];
Products *p7=[Products initProductWithName:@"三星" withCount: withImage:@"hshhh.jpg"];
Products *p8=[Products initProductWithName:@"" withCount: withImage:@"hshhh.jpg"]; NSArray *sproducts=[NSArray arrayWithObjects:p1,p2,p3,p4,p5,p6,p7,nil]; //数量小于9 定义谓词 包含过滤条件
NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",];
//过滤结果返回新的数组
NSArray *newArray=[sproducts filteredArrayUsingPredicate:prdicate];
for (Products *item in newArray) {
NSLog(@"newArray=%@",item.productName);
} //数量大于9 并且productname等于“三星jfggg” 定义谓词 包含过滤条件
prdicate=[NSPredicate predicateWithFormat:@"productName='三星' && productCount>9"];
//过滤结果返回新的数组
newArray=[sproducts filteredArrayUsingPredicate:prdicate];
for (Products *item in newArray) {
NSLog(@"newArray=%@",item.productName);
} //in(包含) *注意 包含是全字匹配
prdicate = [NSPredicate predicateWithFormat:@"productName IN {'g','华为','三星'}||productCount IN {2,5}"];
//过滤结果返回新的数组
newArray=[sproducts filteredArrayUsingPredicate:prdicate];
for (Products *item in newArray) {
NSLog(@"newArray=%@",item.productName);
} //productName以a开头的
prdicate = [NSPredicate predicateWithFormat:@"productName BEGINSWITH 'A'"];
//productName以ba结尾的
prdicate = [NSPredicate predicateWithFormat:@"productName ENDSWITH 'g'"]; //name中包含字符a的
prdicate = [NSPredicate predicateWithFormat:@"productName CONTAINS 'a'"]; //like 匹配任意多个字符
//productName中只要有s字符就满足条件
prdicate = [NSPredicate predicateWithFormat:@"productName like '*s*'"];
//?代表一个字符,下面的查询条件是:name中第二个字符是s的
prdicate = [NSPredicate predicateWithFormat:@"productName like '?s*'"]; newArray=[sproducts filteredArrayUsingPredicate:prdicate];
for (Products *item in newArray) {
NSLog(@"newArray=%@",item.productName);
} //正则表达式 验证是否是手机号
BOOL isMobileNum=[self isMobileNumber:p8.productName];
if(isMobileNum)
NSLog(@"是真确的手机号:%@",p8.productName); } - (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(@"中国移动");
} else if([regextestct evaluateWithObject:mobileNum] == YES) {
NSLog(@"联通");
} else if ([regextestcu evaluateWithObject:mobileNum] == YES) {
NSLog(@"电信");
} else {
NSLog(@"Unknow");
} return YES;
}
else
{
return NO;
}
}
@end

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

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

//数量小于9  定义谓词 包含过滤条件
NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",];
//过滤结果返回新的数组
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:@""] ;

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

IOS开发之NSPredicate谓词的用法的更多相关文章

  1. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  2. 李洪强iOS开发之iOS社区收集

    李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...

  3. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  4. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  5. IOS开发之ZBarReaderView的使用

    IOS开发之ZBarReaderView的使用 HOMEABOUTGUESTBOOKCATEGORIESTAGSLINKSSUBSCRIBE 当开发IOS程序中需要用到二维码识别功能的时候,zbar这 ...

  6. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  7. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  8. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  9. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

随机推荐

  1. hdoj 1071 The area

    The area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. [OC Foundation框架 - 16] NSObject和反射

    1.判断某个对象是否属于一个类 Student *stu = [[[Student alloc] init] autorelease]; BOOL result= [stu isKindOfClass ...

  3. sublime text3的一些小技巧记录(配gif图)

    缓慢更新 1.同时操作多行数据. 示例: 选择你需要的块,然后按ctrl+shift+L键,然后再按end或者home键.

  4. 【C++编程规范】编程需要避免的常见错误

    前言 C++有不少陷阱或者容易失误的地方,稍不注意就会导致程序bug. 正文 1.无符号数和有符号数比较 #define只是简单的文本替换,如果替换的是简单数值,默认是int,和unsigned in ...

  5. The Sorrows of Young Werther

    The Sorrows of Young Werther J.W. von Goethe Thomas Carlyle and R.D. Boylan Edited by Nathen Haskell ...

  6. mac不可或缺的套件管理器Homebrew

    Homebrew 1.简介 可以帮助我们快速安装软件, 如 brew install svn 快速卸载软件 , 如  brew uninstall svn 2.下载 打开终端, /usr/bin/ru ...

  7. java 对视频和图片进行加密解密

    import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java. ...

  8. ListOrderedMap

    要有序能够用List,要便于查找能够用Map,那既要有序又便于查找呢? 近期我就遇到了这样一个问题.Java没有给我们提供现成的类.我们全然能够自己开发个类继承List和Map(Java原来就有不能够 ...

  9. Unity3d 网络编程(一)(Unity3d内建网络Network介绍)

    首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库. RakNet.所以对于移动设备来说,用Unity3d来写server是全然能够的,而且内建网络库的各项功能封 ...

  10. 通过IP控制登录系统

    项目中有这么一个需求,就是系统仅仅能在指定ip下登录,能够理解为内部系统,仅仅能够在公司訪问 我的代码是这样写的:入不入流不知道,但能解决这个问题. 获得訪问IP代码: String ip = req ...