在開發中,咱們常常會遇到一些須要,讓咱們從集合中查找某個值,從集合中過濾想要的內容等等,於是咱們就須要遍歷
集合,加條件判斷,而後獲取符合條件的值。而關於集合的遍歷
是全部軟件開發從業人員常常打交道的一些事情。正則表達式
把範圍縮小到iOS開發中,關於集合地遍歷的方法就有好多種,人們一直在討論和爭辯,想尋找出一種最快最有效的方法,是用for循環
,仍是block
,是用併發操做
,仍是順序操做
,等等。甚至有人不惜使用大數據量
來測試各類遍歷方式的效率
以及精確度
。併發
然而我認爲尋找並選擇一種本身認爲合適的操做是最好的,簡單地幾個數據的集合,就用到普通的for循環,基於大數據量的遍歷就須要用到併發操做。框架
NSPredicate
而我並不會在這裏展現如何遍歷集合,而是提示一種在iOS開發中,用一種相似於SQL語句來過濾集合內容的方式從而避免了本身進行集合遍歷的方法,就是NSPredicate
。蘋果在Cocoa touch框架給咱們提供了NSPredicate
這個類,封裝了一些讓咱們能夠直接對集合設置過濾條件的方法,而至於蘋果是如何在SDK中進行數據查找地,咱們並不須要關心,由於我相信它作的必定比咱們好。學過SQL語法
的人,使用NSPredicate
會十分容易。我會在下面的內容中詳細的講述NSPredicate
的語法規則。測試
如<, >, == , !=, 等等這些數學符號表達式,在NSPredicate的format中依然有效大數據
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF > 10"];
"SELF"表明的時集合中的對象自己,此時集合對象是整型數據,在iOS中的集合能夠是nil以外的任何數據類型。code
如IN
,BETWEEN
等等這種表明範圍區間的格式字符串,能夠形象地稱之爲關鍵字orm
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"age BETWEEN {1,5}"];
"age"表明了集合中對象的一個實例屬性,此時集合中的對象是一個個的實體。對象
如BEGINSWITH
,ENDSWITH
,CONTAINS
,顧名思義,咱們能夠很容易理解他們的過濾條件開發
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",text];
在格式化語言中,咱們仍然能夠自如地使用」%@「等符號表示變量。[cd]中的c表示不區分大小寫,d表示不區分發音符號。字符串
如LIKE
,這些與SQL語義中的關鍵字定義十分相像。
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'"];
在NSPredicate格式串中,是自動給字符串加上引號的,因此咱們自定義的字符串必須加上引號(單/雙)
如MATCHES
,諸如其餘的查找語言,都是須要匹配正則表達式的
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name MATCHES 'Z.+e$'"];
如AND
,在設置過濾條件時,可能單一條件並不能知足咱們的須要,因此咱們就須要設置組合條件
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'" AND age > 10];