是否有创建条件NSDictionary的简写语法



有办法创建条件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。但我不会仅仅为了避免在其他地方使用几行代码而推荐它。

最新更新