IOS开发之NSPredicate谓词的用法

编程的人员不管是上过大学还是从培训机构出来的都应该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
 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.。。

时间: 2024-12-25 08:12:23

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

iOS开发之17个常用代码整理

1.判断邮箱格式是否正确的代码 //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@&quo

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

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地 址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索 这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要

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

李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. cocoachina 号称全球最热的苹果开发社区,这里有很多关于iOS,mac开发的相关文章,值得收藏的中午社区 Swift 语言指南 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排,虽然看上去只是一篇博文,但是作者每周都在更新,从这个角度来说,我把它归类到社区中. swiftk

IOS开发之ZBarReaderView的使用

IOS开发之ZBarReaderView的使用 HOMEABOUTGUESTBOOKCATEGORIESTAGSLINKSSUBSCRIBE 当开发IOS程序中需要用到二维码识别功能的时候,zbar这个开源库估计会被不少人选择.但是关于zbar的用法,网上的资料大部分都集中在ZBarReaderViewController这个类的使用上.本人在使用中,发现ZBarReaderViewController这 个类使用很不灵活,比如,如果需要对界面做一些自定义的定制时会变得很麻烦.在zbar的头文件

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

李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501018 JHChainableAnimations 可读性好使用方便的动画库,语法类似与Masonry,使用链式编程 20150506 awesome-ios-chart iOS平台下的各种图表组件 20150513 DevArticles iOS Animation 主流炫酷动画框架(特效)收集整

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {