获取与 NSDictionary 对象类型相关的错误

Posted

技术标签:

【中文标题】获取与 NSDictionary 对象类型相关的错误【英文标题】:Getting error related to NSDictionary object type 【发布时间】:2015-02-26 07:32:30 【问题描述】:

我想根据国家名称或国家 ISD 代码过滤国家列表。例如,如果用户键入“9”,则应将印度添加到过滤后的数组中,因为印度的 ISD 代码为“+91”。我的数据源包含所有信息,如国家名称、ISD 代码等。

这是我的数组的结构:

- (void)viewDidLoad

    [super viewDidLoad];

    arrTotalCountries    = [[NSMutableArray alloc] init];
    arrFilteredCountries = [[NSArray alloc] init];

    NSDictionary *dic1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"India",@"IN",@"+91",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"2",@"Australia",@"AU",@"+42",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"3",@"New Zealand",@"NZ",@"+63",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"4",@"South Africa",@"SA",@"+94",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic5 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"5",@"England",@"EN",@"+75",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic6 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"6",@"Israel",@"IS",@"+86",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic7 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"7",@"Afghanistan",@"AF",@"+27",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];
    NSDictionary *dic8 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"8",@"Ireland",@"IR",@"+18",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]];

    [arrTotalCountries addObject:dic1];
    [arrTotalCountries addObject:dic2];
    [arrTotalCountries addObject:dic3];
    [arrTotalCountries addObject:dic4];
    [arrTotalCountries addObject:dic5];
    [arrTotalCountries addObject:dic6];
    [arrTotalCountries addObject:dic7];
    [arrTotalCountries addObject:dic8];

    [self filterContentForSearchText:@"9"];
 

这就是我尝试过滤数组的方式。出于测试目的,我刚刚通过了静态“9”。

- (void)filterContentForSearchText:(NSString *)searchText

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF.CountryName BEGINSWITH[cd] %@) OR (SELF.ISDCode BEGINSWITH[cd] %@)", searchText];
    NSArray *filtered = [arrTotalCountries filteredArrayUsingPredicate:predicate];
    NSLog(@"%@",[filtered description]);

运行时出现以下错误。

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法对不是字符串的内容进行子字符串操作 (lhs = +91 rhs = ViewController)”

我认为这是因为字典中的键“ISDCode”有类似“+91”的值。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你的谓词需要两个参数,但你只传递了 1,它应该是

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF.CountryName BEGINSWITH[cd] %@) OR (SELF.ISDCode BEGINSWITH[cd] %@)", searchText, searchText];

通过仅提供 1 个参数,第二个随机内存被占用,在这种情况下被证明是一个视图控制器。

【讨论】:

顺便说一句,您不需要将SELF. 显式添加到谓词中,因为它是为您隐式完成的。 @Wain,它对我很有用。我已经解决了我的问题。非常感谢您的回答。赞成并接受!

以上是关于获取与 NSDictionary 对象类型相关的错误的主要内容,如果未能解决你的问题,请参考以下文章

值/对象的 NSDictionary 键? [复制]

如何从 NSDictionary 获取整个对象

从 NSDictionary 中按键获取具有特定值的对象

转换对象以写入firebase? (只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象)

InvalidFirebaseData Swift 3 只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。

从 NSDictionary 对象的 NSArray 中,如何获取唯一的 NSArray