有没有办法如何创建条件NSDictionary?例如,假设有一个包含3个属性的自定义类:
class UserInfoObject
firstName
lastName
address
我需要的是为userInfoObject中的非零属性创建NSDictionary。当我事先知道哪些属性是非零时,它是直截了当的,所以我可以使用这种简写语法(或经典的语法):
NSDictionary *userInfoDic = @{@"firstName": userInfoObject.firstName, @"lastName":userInfoObject.lastName, @"address":userInfoObject.address}
但是在我的情况下,我需要创建可变字典,然后为每个属性执行手动检查/添加。在下面做另一种更短的方式吗?
// Create mutable thing
NSMutableDictionary *userInfoDic = [NSMutableDictionary new];
// Check and add first name
if (userInfoDic.firstName) {
userInfoDic[@"firstName"] = userInfoDic.firstName;
}
// Check and add last name
if (userInfoDic.lastName) {
userInfoDic[@"lastName"] = userInfoDic.lastName;
}
// Check and add address
if (userInfoDic.address) {
userInfoDic[@"address"] = userInfoDic.address;
}
我有很多类和属性,所以速记(如果存在)可以促进这个过程:)
答案 0 :(得分:3)
NSMutableDictionary already does this。
setValue:forKey:
为可变字典做了这个:
此方法使用
setObject:forKey:
为字典添加值和键,除非值为nil,在这种情况下,该方法会尝试使用removeObjectForKey:
删除键。
因此,请使用setValue:forKey:
代替setObject:forKey:
。此方法没有简写字面值。您可以编写自己的NSMutableDictionary子类并覆盖setObject:forKeyedSubscript:
以安全地忽略nil
个对象,但这似乎太多了。正如文件所说:
通常不需要子类NSMutableDictionary。如果确实需要自定义行为,通常最好考虑组合而不是子类化。
这意味着您应该而不是子类创建自己的包装器对象,该对象具有NSMutableDictionary作为后备存储,并实现访问内部字典所需的所有方法,覆盖setObject:forKeyedSubscript:
以使用零。但我不建议只是为了避免其他地方的几行代码。