iOS開發(fā) - NSPredicate試探(Swift5.1版)

最近看了一遍文章,是NSPredicate謂詞的講解熄诡。可是文章歸文章诗力,還是親手試驗(yàn)一下才能轉(zhuǎn)化成自己的知識(shí)凰浮。Let's go ~ !

  1. 如何理解NSPredicate的作用?
    根據(jù)它的語(yǔ)法苇本,我簡(jiǎn)單粗暴地理解成它是一種 過(guò)濾條件 袜茧。 與SQL的查找語(yǔ)句比較相似

  2. 初試

由淺入深,先來(lái)寫死參數(shù)試試
等價(jià)于 100 >= 167 <= 200 瓣窄, 這個(gè)沒問(wèn)題笛厦。

image

動(dòng)態(tài)傳參 ,使用字符串格式化占位符 %@ 俺夕、 %d 裳凸,這個(gè)也是很常用了。
但它并不檢查語(yǔ)法啥么,比如我嘗試用Float類型傳進(jìn)去%d中登舞,會(huì)出現(xiàn)類型不匹配,而導(dǎo)致條件語(yǔ)句并非我們所期望的

image
image
  1. 保留字(不論大小寫)

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

  1. 數(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ā)送消息。

image.png

(4) 回到Person的屬性上娇斩,試著加上@objc之后仁卷。成功得到期待中的結(jié)果了??


image.png
  1. 特殊字符
 *     通配符 (配合LIKE作為模糊搜索使用)
?     代表一個(gè)字符 (配合LIKE作為模糊搜索使用)
  1. 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")
image.png

配合?占位符副签,一個(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??")
image.png
  1. 忽略大小寫[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*")
image.png

雖然暫時(shí)沒有在實(shí)際項(xiàng)目中使用過(guò)基矮,但總感覺會(huì)用得上??

小弟不才,若有錯(cuò)誤之處冠场,歡迎留言討論(^_^)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末家浇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碴裙,更是在濱河造成了極大的恐慌钢悲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舔株,死亡現(xiàn)場(chǎng)離奇詭異莺琳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)载慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惭等,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人办铡,你說(shuō)我怎么就攤上這事辞做。” “怎么了寡具?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵秤茅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我童叠,道長(zhǎng)框喳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任拯钻,我火速辦了婚禮帖努,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粪般。我一直安慰自己拼余,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布亩歹。 她就那樣靜靜地躺著匙监,像睡著了一般。 火紅的嫁衣襯著肌膚如雪小作。 梳的紋絲不亂的頭發(fā)上亭姥,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音顾稀,去河邊找鬼达罗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粮揉。 我是一名探鬼主播巡李,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扶认!你這毒婦竟也來(lái)了侨拦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辐宾,失蹤者是張志新(化名)和其女友劉穎狱从,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠纹,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡季研,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吊洼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训貌。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冒窍,靈堂內(nèi)的尸體忽然破棺而出递沪,到底是詐尸還是另有隱情,我是刑警寧澤综液,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布款慨,位于F島的核電站,受9級(jí)特大地震影響谬莹,放射性物質(zhì)發(fā)生泄漏檩奠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一附帽、第九天 我趴在偏房一處隱蔽的房頂上張望埠戳。 院中可真熱鬧,春花似錦蕉扮、人聲如沸整胃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屁使。三九已至,卻和暖如春奔则,著一層夾襖步出監(jiān)牢的瞬間蛮寂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工易茬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酬蹋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像除嘹,于是被迫代替她去往敵國(guó)和親写半。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容