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

时间:2013-12-20 11:11:48

标签: ios objective-c nsdictionary

有没有办法如何创建条件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;
}

我有很多类和属性,所以速记(如果存在)可以促进这个过程:)

1 个答案:

答案 0 :(得分:3)

NSMutableDictionary already does this

setValue:forKey:为可变字典做了这个:

  

此方法使用setObject:forKey:为字典添加值和键,除非值为nil,在这种情况下,该方法会尝试使用removeObjectForKey:删除键。

因此,请使用setValue:forKey:代替setObject:forKey:。此方法没有简写字面值。您可以编写自己的NSMutableDictionary子类并覆盖setObject:forKeyedSubscript:以安全地忽略nil个对象,但这似乎太多了。正如文件所说:

  

通常不需要子类NSMutableDictionary。如果确实需要自定义行为,通常最好考虑组合而不是子类化。

这意味着您应该而不是子类创建自己的包装器对象,该对象具有NSMutableDictionary作为后备存储,并实现访问内部字典所需的所有方法,覆盖setObject:forKeyedSubscript:以使用零。但我不建议只是为了避免其他地方的几行代码。