最近看了一遍文章,是NSPredicate謂詞的講解熄诡。可是文章歸文章诗力,還是親手試驗(yàn)一下才能轉(zhuǎn)化成自己的知識(shí)凰浮。Let's go ~ !
如何理解NSPredicate的作用?
根據(jù)它的語(yǔ)法苇本,我簡(jiǎn)單粗暴地理解成它是一種 過(guò)濾條件 袜茧。 與SQL的查找語(yǔ)句比較相似初試
由淺入深,先來(lái)寫死參數(shù)試試
等價(jià)于 100 >= 167 <= 200 瓣窄, 這個(gè)沒問(wèn)題笛厦。
動(dòng)態(tài)傳參 ,使用字符串格式化占位符 %@ 俺夕、 %d 裳凸,這個(gè)也是很常用了。
但它并不檢查語(yǔ)法啥么,比如我嘗試用Float類型傳進(jìn)去%d中登舞,會(huì)出現(xiàn)類型不匹配,而導(dǎo)致條件語(yǔ)句并非我們所期望的
- 保留字(不論大小寫)
AND悬荣、OR菠秒、IN、NOT氯迂、ALL践叠、ANY、SOME嚼蚀、NONE禁灼、LIKE、CASEINSENSITIVE轿曙、CI弄捕、MATCHES、CONTAINS导帝、BEGINSWITH守谓、ENDSWITH、BETWEEN您单、NULL斋荞、NIL、SELF虐秦、TRUE平酿、YES凤优、FALSE、NO蜈彼、FIRST筑辨、LAST、SIZE柳刮、ANYKEY挖垛、SUBQUERY、CAST秉颗、TRUEPREDICATE痢毒、FALSEPREDICATE
- 數(shù)組過(guò)濾
(1) 首先抽出 BEGINSWITH (以特定條件開頭)作為試驗(yàn)。網(wǎng)上看了很多文章蚕甥,都是OC或者是舊版swift版本的哪替。在swift5.1中,真實(shí)試驗(yàn)才發(fā)現(xiàn)有坑菇怀。
這是從網(wǎng)上文章參考的凭舶,定義了一個(gè)Person的類 , 類中帶有name和age屬性爱沟。一切看起來(lái)都完美無(wú)暇??
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)"
}
}
(2) 然后添加三個(gè)數(shù)據(jù)帅霜,并開始過(guò)濾
let personArray = NSMutableArray.init()
personArray.add(Person(name: "Jack Tomphon", age: 23))
personArray.add(Person(name: "Mikle Steven", age: 25))
personArray.add(Person(name: "Tacmk", age: 24))
print("personArray-->\(personArray)")
let predicate = NSPredicate.init(format: "%K BEGINSWITH %@", "name" , "M")
print("條件語(yǔ)句-->\(predicate.predicateFormat)")
let resultArray:NSArray = personArray.filtered(using: predicate) as NSArray
print("結(jié)果-->\(resultArray)")
(3) 問(wèn)題來(lái)了,報(bào)錯(cuò) “該類與鍵名不符合鍵值編碼” 呼伸。
這個(gè)問(wèn)題困擾了一天身冀,我嘗試轉(zhuǎn)用Swift的Array是沒有NSPredicate的filter方法的。然后它的報(bào)錯(cuò)信息表明了括享,是使用KVC取值的搂根,也就是基于runtime。再回想一下我們定義按鈕點(diǎn)擊方法時(shí)铃辖,函數(shù)名前面需要加上@objc剩愧,因?yàn)槭莿?dòng)態(tài)發(fā)送消息。
(4) 回到Person的屬性上娇斩,試著加上@objc之后仁卷。成功得到期待中的結(jié)果了??
- 特殊字符
* 通配符 (配合LIKE作為模糊搜索使用)
? 代表一個(gè)字符 (配合LIKE作為模糊搜索使用)
- LIKE
不配合*或? 的話,是精確匹配犬第,必須完全相同才能拿到結(jié)果五督。
配合*通配符,下面例子是可以匹配到Mikle Steven瓶殃。 如果通配符在后面,Steven* 則匹配不到
let personArray = NSMutableArray.init()
personArray.add(Person(name: "Jack Tomphon", age: 23))
personArray.add(Person(name: "Mikle Steven", age: 25))
personArray.add(Person(name: "Tacmk", age: 24))
let predicate = NSPredicate.init(format: "%K LIKE %@", "name" , "*Steven")
配合?占位符副签,一個(gè)?占一個(gè)字符位置遥椿,長(zhǎng)度不相同則匹配失敗
let personArray = NSMutableArray.init()
personArray.add(Person(name: "Jack Tomphon", age: 23))
personArray.add(Person(name: "Mikle Steven", age: 25))
personArray.add(Person(name: "Tacmk", age: 24))
let predicate = NSPredicate.init(format: "%K LIKE %@", "name" , "??c??")
- 忽略大小寫[c] 與 忽略重音符號(hào)[d]
let personArray = NSMutableArray.init()
personArray.add(Person(name: "Jack Tomphon", age: 23))
personArray.add(Person(name: "Mikle Steven", age: 25))
personArray.add(Person(name: "Tacmk", age: 24))
personArray.add(Person(name: "??", age: 100))
let predicate = NSPredicate.init(format: "%K LIKE[cd] %@", "name" , "*i*")
雖然暫時(shí)沒有在實(shí)際項(xiàng)目中使用過(guò)基矮,但總感覺會(huì)用得上??
小弟不才,若有錯(cuò)誤之處冠场,歡迎留言討論(^_^)