言:谓词在集合过滤以及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的更多相关文章

  1. 【OpenStack】OpenStack系列3之Swift详解

    Swift安装部署(与keystone依赖包有冲突,需要安装不同版本eventlet) 参考:http://www.server110.com/openstack/201402/6662.html h ...

  2. [Xcode 实际操作]一、博主领进门-(8)应用代理文件(AppDelegate.swift)详解

    目录:[Swift]Xcode实际操作 本文将演示使用iOS模拟器,演示程序的生命周期. 在项目导航区,打开应用代理文件[AppDelegate.swift] 应用代理文件时系统运行本应用的委托,里面 ...

  3. swift详解之九---------------自动引用计数、循环引用

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

  4. swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )

    异常处理.类型转换 ( Any and AnyObject ) 1.错误处理 (异常处理) swift 提供第一类错误支持 ,包括在运行时抛出 ,捕获 , 传送和控制可回收错误.在swift中 ,错误 ...

  5. 【OpenStack】OpenStack系列4之Glance详解

    下载安装 参考:http://www.linuxidc.com/Linux/2012-08/68964.htm http://www.it165.net/os/html/201402/7246.htm ...

  6. Swift语言的基础详解

    1.1.关于swift · Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采 ...

  7. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  8. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  9. ios开发——实用技术OC-Swift篇&本地通知与远程通知详解

    本地通知与远程通知详解 一:本地通知   Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...

随机推荐

  1. E20170510-hm

    prototype  n.     原型,雏形,蓝本; omit (omitted)  vt.     省略; 遗漏; autonomous  adj.     自治的; 有自主权的; fold   ...

  2. Cg(C for Graphic)语言关键字(转)

    摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 第三章从 GPU 运行原理和数据流程的角 ...

  3. 关于国债的一些计算: 理论TF价格1(缴款日前无付息)

    计算 ExpectedTFPrice 是一个比较复杂的计算,我们这里讨论简单的一种情况. 给定一只可交割国债bond(一般为CTD),一个国债期货tf,一个日期t(表示tf的一个交易日期,我们通过t日 ...

  4. IDEA打开父类的接口方法快捷键

    有两个类,分别为A类是接口.B类为A的实现类. 如果想在B类里的某个方法,打开A类 可以鼠标右键点击这个方法名,按下键盘:Ctrl+U,就可以跳转到A类接口的该方法上面.

  5. JDK由浅到深的理解

    一.JDK的安装 二.JDK安装后目录下的文件夹的用处 bin:编译器(javac.exe); db:jdk从1.6之后内置Derby数据库,它是一个纯用Java实现的内存数据库,Apache的开源项 ...

  6. 第十一篇 .NET高级技术之内置泛型委托

    Func.Action 一.如果不是声明为泛型委托 委托的类型名称不能重载,也就是不能名字相同类型参数不同 二..Net中内置两个泛型委托Func.Action(在“对象浏览器”的mscorlib的S ...

  7. spring AOP excution表达式各符号意思

    execution(*com.sample.service.impl..*.*(..)) 符号 含义 execution() 表达式的主题 第一个“*”符号 表示返回值的类型任意: com.sampl ...

  8. Hibernate中表与表之间的关联一对多,级联保存和级联删除

    1:Hibernate的一对多操作(重点) 一对多映射配置 第一步:创建两个实体类:客户和联系人(例)以客户为一,联系人为多: package com.yinfu.entity; public cla ...

  9. bzoj1024 [SCOI2009]生日快乐【dfs】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1024 普通的深搜. #include <cstdio> #include < ...

  10. UVa 12186 Another Crisis 工人的请愿书

    c表示某上司上报的最少请愿下属,k表示总下属c=0.01T*k=kT/100(0.01T*k是整数)c=[0.01T*k]+1=[kT/100]+1(0.01T*k不是整数) kT=100 c=1 k ...