编程的人员不管是上过大学还是从培训机构出来的或做后台的、前端的都应该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. java IO选择流的原则及其与IO流相关类的关系

    1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...

  2. 第一个android程序所遇到问题

    1.工程package的命名空间与activity的命名空间不一致,导致setcontentview找不到layout文件 2.增加Button等控件后,Java.R中id必须在删除现有Java.R文 ...

  3. Android 命名规范和编码规范

    简明概要  多写注释 一.关于命名规范 对于开发项目来说肯定是要有统一的规范,然而命名规范需要做到哪几点呢? 答: 首先,不能反人类. 再来就是,要望文而知其意. 下面就来说说具体该怎么去规范我们的代 ...

  4. ecshop去官方化的修改

    1:如何修改网站"欢迎光临本店" 回答:languages\zh_cn\common.php文件中, $_LANG['welcome'] = '欢迎光临本店';将他修改成你需要的字 ...

  5. OO ALV 学习参考

      http://blog.csdn.net/sapliumeng/article/details/18653491 一.ALV介绍 The ALV Grid Control (ALV = SAPLi ...

  6. class ResultServletContextListener implements ServletContextListener

    package com.management.spring; import java.io.BufferedReader; import java.io.IOException; import jav ...

  7. java.io.File中的pathSeparator与separator的区别

    先总的说一下区别:File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:java   -cp   test.jar;abc.jar   HelloWorld就是指“;” Fi ...

  8. Sublime Text 3 安装插件管理 Package Control

    自动安装: 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴对应版本的代码后回车安装 适用于 Sublime Text 3: import   ...

  9. CSS字体大小设置时的参考(转)

    from:http://blog.sina.com.cn/s/blog_51cd580b0100gg6y.html font-size 设置的绝对关键字: 以下几个绝对字体大小的设置是有效的.当然他们 ...

  10. 不同linux系统添加开机启动程序的命令

    see http://phpcj.org/blog/%E4%B8%8D%E5%90%8Clinux%E7%B3%BB%E7%BB%9F%E6%B7%BB%E5%8A%A0%E5%BC%80%E6%9C ...