Swift详解之NSPredicate
2015-10-07 13:59
543 查看
言:谓词在集合过滤以及CoreData中有着广泛的应用。本文以Playground上的Swift代码为例,讲解如何使用NSPredicate。
然后,再看看Playgound给出的动态结果
可以看到,以上四种方式的效果是一样的,由此我们接着讲解谓词的语法结构。
使用
使用
1. > 大于
2. > =大于等于
3. < 小于
4. <=小于等于
5. ==等于
6. != 或者<> 不等于
7. BETWEEN 介于两者之间,包括上下限
举个例子
就是过滤24 <=age<=25
所以,可以看到Playground给出的结果是
|| 或者 OR 逻辑或
!或者NOT 逻辑非
较为简单,这里不举例子了
CONTAINS 左边表达式包含右边表达式
ENDSWITH 左边表达式以右边表达式结尾
LIKE 左边表达式和右边表达式相似(简单的正则表达式匹配,?匹配一个字符,*匹配0个或者多个字符)
MATCHES 可以实现较为复杂的曾则表达式匹配
用方括号加cd来不区分大小写和变音符号
IN 左边的表达式在右边的集合里
匹配以Ja开头
名字里包含ac,不区分大小写,并且年龄大于等于24
复合正则表达式T[a-z]*k
名字是两者中的一个
简单的Block定义age >24
我的iOS SDK基础详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
我的博客iOS部分目录
/article/1511826.html
准备工作
先在Playground上建立一个数组,为后文的谓词过滤做准备.这里我们充血了Description属性来为提供更加明显的输出。import UIKit class Person:NSObject { var name:String var age:Int init(name:String,age:Int) { self.name = name self.age = age super.init() } override var description:String{ return "name:\(self.name) age:\(self.age)" } } let persons = NSMutableArray() persons.addObject(Person(name: "Jack Tomphon", age: 23)) persons.addObject(Person(name: "Mikle Steven", age: 25)) persons.addObject(Person(name: "Tacmk", age: 24))
从一个例子开始
let pridicateByAge = NSPredicate(format: "age == 24") let pridicateByAge2 = NSPredicate(format: "age == %@",NSNumber(int: 24)) let pridicateByAge3 = NSPredicate(format: "%K == %@","age",NSNumber(int: 24)) let pridicateByAge4 = NSPredicate (format: "age == $age") let result = persons.filteredArrayUsingPredicate(pridicateByAge) let resule2 = persons.filteredArrayUsingPredicate(pridicateByAge2) let result3 = persons.filteredArrayUsingPredicate(pridicateByAge3) let result4 = persons.filteredArrayUsingPredicate(pridicateByAge4.predicateWithSubstitutionVariables(["age":NSNumber(int: 24)]))
然后,再看看Playgound给出的动态结果
可以看到,以上四种方式的效果是一样的,由此我们接着讲解谓词的语法结构。
语法结构
使用%@对应数字,字符串,日期的替代值
使用
%K对应要比较的属性,也就是KVC中的key
使用
$变量名来表示通配的变量,然后
predicateWithSubstitutionVariables来决定具体的变量值
基本比较
比较符号,都是针对于左边表达式和右边表达式1. > 大于
2. > =大于等于
3. < 小于
4. <=小于等于
5. ==等于
6. != 或者<> 不等于
7. BETWEEN 介于两者之间,包括上下限
举个例子
let pridivateByAge5 = NSPredicate(format: "age BETWEEN { %@ , %@ }", NSNumber(int: 24),NSNumber(int: 25)) let result5 = persons.filteredArrayUsingPredicate(pridivateByAge5)
就是过滤24 <=age<=25
所以,可以看到Playground给出的结果是
"[name:Mikle Steven age:25, name:Tacmk age:24]"
复合比较
&& 或者AND 逻辑与|| 或者 OR 逻辑或
!或者NOT 逻辑非
较为简单,这里不举例子了
字符串比较
BEGINSWITH 左边表达式以右边表达式开头CONTAINS 左边表达式包含右边表达式
ENDSWITH 左边表达式以右边表达式结尾
LIKE 左边表达式和右边表达式相似(简单的正则表达式匹配,?匹配一个字符,*匹配0个或者多个字符)
MATCHES 可以实现较为复杂的曾则表达式匹配
用方括号加cd来不区分大小写和变音符号
IN 左边的表达式在右边的集合里
匹配以Ja开头
let pridivateByName1 = NSPredicate(format: "name BEGINSWITH %@","Ja") let result6 = persons.filteredArrayUsingPredicate(pridivateByName1) println(result6)
名字里包含ac,不区分大小写,并且年龄大于等于24
let pridivateByName2 = NSPredicate(format: "name CONTAINS %@ && age >= %@", "ac",NSNumber(int: 24)) let result7 = persons.filteredArrayUsingPredicate(pridivateByName2) println(result7)
复合正则表达式T[a-z]*k
let privatedivateByName3 = NSPredicate(format: "name MATCHES 'T[a-z]*k'") let result8 = persons.filteredArrayUsingPredicate(privatedivateByName3)
名字是两者中的一个
let privatedivateByName4 = NSPredicate(format: "name IN {'Tacmk','Jack Tomphon'}") let result9 = persons.filteredArrayUsingPredicate(privatedivateByName4)
基于Block的谓词
注意:基于Blcok的谓词不能用在CoreData的数据过滤上。基于Block能够灵活的定制谓词。简单的Block定义age >24
let blockPredicate = NSPredicate { (person: AnyObject!, [NSObject : AnyObject]!) -> Bool in var result = false if let castResult = person as? Person{ if castResult.age > 24{ result = true } } return result } let result10 = persons.filteredArrayUsingPredicate(blockPredicate)
我的iOS SDK基础详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
我的博客iOS部分目录
/article/1511826.html
相关文章推荐
- Swift学习笔记20——协议(Protocols)
- 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张
- Swift与OC代码转换实例
- swift中的as?和as!
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
- Swift - 给图片添加滤镜效果(棕褐色老照片滤镜,黑白滤镜)
- Swift - .plist文件数据的读取和存储
- Swift - 使用HTML5进行iOS开发(将HTML5打包成iOS应用)
- Swift - 禁用UIWebView和WKWebView的下拉拖动效果
- Swift - 异步加载各网站的favicon图标,并在单元格中显示
- Swift - 使用闭包筛选过滤数据元素
- Swift - 使用UI Dynamics给UIKit组件添加移动吸附行为
- Swift - 使用UI Dynamics给UIKit组件添加重力和碰撞行为
- Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)
- Swift - 如何实现字符串的HMAC_SHA1加密
- Swift - 获取字符串的MD5值
- Swift - iOS中各种视图控制器(View Controller)的介绍
- Swift - 使用NSNotificationCenter发送通知,接收通知
- Swift - 使用NSURLSession同步获取数据(通过添加信号量)
- swift控件代码