Swift详解之NSPredicate
言:谓词在集合过滤以及CoreData中有着广泛的应用。本文以Playground上的Swift代码为例,讲解如何使用NSPredicate。
准备工作
先在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部分目录
http://blog.csdn.net/hello_hwc/article/details/45365385
Swift详解之NSPredicate的更多相关文章
- 【OpenStack】OpenStack系列3之Swift详解
Swift安装部署(与keystone依赖包有冲突,需要安装不同版本eventlet) 参考:http://www.server110.com/openstack/201402/6662.html h ...
- [Xcode 实际操作]一、博主领进门-(8)应用代理文件(AppDelegate.swift)详解
目录:[Swift]Xcode实际操作 本文将演示使用iOS模拟器,演示程序的生命周期. 在项目导航区,打开应用代理文件[AppDelegate.swift] 应用代理文件时系统运行本应用的委托,里面 ...
- swift详解之九---------------自动引用计数、循环引用
自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...
- swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )
异常处理.类型转换 ( Any and AnyObject ) 1.错误处理 (异常处理) swift 提供第一类错误支持 ,包括在运行时抛出 ,捕获 , 传送和控制可回收错误.在swift中 ,错误 ...
- 【OpenStack】OpenStack系列4之Glance详解
下载安装 参考:http://www.linuxidc.com/Linux/2012-08/68964.htm http://www.it165.net/os/html/201402/7246.htm ...
- Swift语言的基础详解
1.1.关于swift · Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采 ...
- iOS开发——网络编程Swift篇&Alamofire详解
Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...
- iOS开发——网络编程Swift篇&(八)SwiftyJSON详解
SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...
- ios开发——实用技术OC-Swift篇&本地通知与远程通知详解
本地通知与远程通知详解 一:本地通知 Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...
随机推荐
- iOS View
创建: 2018/04/19 完成: 2018/04/20 View的创建 创建 storyboard上操作 与代码连接 ● 目的: 通过代码控制view ● 按住option拖动 View的坐 ...
- Codeforces Round #436 (Div. 2) E. Fire(背包+记录路径)
传送门 题意 给出n种物品,抢救第\(i\)种物品花费时间\(t_i\),价值\(p_i\),截止时间\(d_i\) 询问抢救的顺序及物品价值和最大值 分析 按\(d_i\)排序的目的是防止以下情况 ...
- python中用代码实现99乘法表
第一种:使用for遍历循环嵌套 ,): ,x+): print("%s*%s=%s" % (y,x,x*y),end=" ") print("&quo ...
- windows虚拟机下 安装docker 踩过的坑
首先,你的是win7.8还是win10 windows对docker兼容也是最近的事,所以win7.8的话,安装docker是要用工具箱的,不过官方给了下载. 国内话的可以通过,阿里镜像,或者清华镜像 ...
- Zabbix-Server 添加主机
之前讲解了如何配置Zabbix 服务端和客户端,现在我们来讲解下如何在zabbix监控端添加主机 Zabbix服务端:Centos 配置 Zabbix服务端 Zabbix客户端:Centos 配置 Z ...
- 跟我一起玩Win32开发(24):计时器
有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的Timer,它虽然不是什么复杂的东西,也称不 上牛X,不过,用处还是不少的,对于那些需要每隔一定时间执行一次的任务,那是相当有用. 先来认识一 ...
- ssh密钥的分发之一:ssh-copy-id
ssh密钥的分发 我们在使用客户端账号对主机记性管理的时候,可以分为以下两种情况: .第一种情况,直接使用root账号: 优点:使用root账号密钥分发简单,指令执行简单 缺点:不安全 .第二种情况, ...
- 剪花布条 HDU - 2087
剪花布条 HDU - 2087 要求各个匹配出来的子串不重叠的kmp.实际上直接贪心从前往后找,每找到一个就把当前j标为0即可.(一般kmp是标为f[j]) #include<cstdio> ...
- 常用的DOCS命令
1.Help 可以查看当前DOS常用命令,是帮助2.Help dir 查看Dir命令的帮助,使用帮助3.ipconfig 查看当前电脑的IP地址4.ping 127.0.0.1 测试与某一台电脑之间网 ...
- HDU 1423 LICS 模板
http://acm.hdu.edu.cn/showproblem.php?pid=1423 4.LICS.O(lena * lenb) 设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时, ...