![](/img/trans.png)
[英]Filter on NSMutableArray with NSPredicate - Return No result
[英]NSMutableArray and NSPredicate filtering
我試圖用一個對象中的兩個實體來過濾我的數組,就像我有一個Person對象,其中我有名字,地址,數字,電子郵件等。我試圖用名稱和數字過濾我的數組對象列表。 如何使用NSPredicate實現這一目標?
創建謂詞(以下假設您的Person
類具有name
和number
字符串屬性):
NSString *nameFilter = @"Steve*";
NSString *numberFilter = @"555-*";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];
然后,過濾數組(假設您有一個Person
對象的NSArray
):
NSArray *personArray = /* obtain from somewhere */;
NSArray *filtered = [personArray filteredArrayUsingPredicate:pred];
結果將是一個包含Person
對象的數組,其name
可以是“Steve”,“Steven”等,其編號以555-
。
你所說的並沒有多大意義。 您無法從類中刪除屬性(或者更確切地說,您不應該刪除)。 如果您只想要一個只包含名稱和數字的數組,則必須遍歷Person
對象數組:
NSMutableArray *result = [NSMutableArray array];
for (Person *p in personArray)
[result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]];
我相信你在尋找:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name];
或者如果你想要字符串名稱的相似之處,你也可以使用:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];
假設電話號碼只是一個int,您可以使用==,<,<=等進行數字比較
然后應用它:
NSArray * filteredarray = [array filteredArrayUsingPredicate:predicate];
我更喜歡使用CONTAINS
字來進行過濾。 這項工作很容易。 或者你可以將它們組合在一起:
NSPredicate * predicate =
[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];
你可以參考官方DOC :
BEGINSWITH:左手表達式以右手表達式開頭。
CONTAINS:左手表達式包含右手表達式。
ENDSWITH:左手表達式以右手表達式結束。
LIKE:左手表達式等於右手表達式:? 和*被允許作為通配符,在哪里? 匹配1個字符,*匹配0個或更多個字符。
匹配:根據ICU v3,左手表達式使用正則表達式比較等於右手表達式(有關詳細信息,請參閱ICU用戶指南中的正則表達式)。
NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];
NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];
feedType
是要比較的Custom對象的屬性, arrayTotalFeed
是Custom對象的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.