有办法创建条件NSDictionary吗?例如,假设有一个具有3个属性的自定义类:
class UserInfoObject
firstName
lastName
address
我需要的是为userInfoObject中的非nil属性创建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;
}
我有很多类和属性,所以简写(如果存在的话)可以促进这个过程:)
NSMutableDictionary已经做到了这一点。
setValue:forKey:
为可变字典执行此操作:
此方法使用
setObject:forKey:
将值和键添加到字典中,除非值为零,在这种情况下,该方法会尝试使用removeObjectForKey:
删除键。
因此,请使用setValue:forKey:
而不是setObject:forKey:
。这个方法没有简写文字。您可以编写自己的NSMutableDictionary子类并覆盖setObject:forKeyedSubscript:
以安全地忽略nil
对象,但这似乎工作量太大。正如文件所说:
通常不需要对NSMutableDictionary进行子类化。如果您确实需要自定义行为,通常最好考虑组合而不是子类化。
这意味着您应该创建自己的包装器对象,而不是子类,该对象具有一个NSMutableDictionary作为后备存储,并实现访问内部字典所需的所有方法,覆盖setObject:forKeyedSubscript:
以使用nil。但我不会仅仅为了避免在其他地方使用几行代码而推荐它。