Objective-C中如何将NSDictionary里的nil值替换为空字符串?
解决方案
Objective-C的字面量NSDictionary不允许插入nil作为value,否则会直接触发崩溃,对应你要的JS空值 fallback 效果可以用以下几种方式实现:
方案1:直接使用三目运算符简写(最推荐)
Objective-C 支持GNU语法扩展,可以省略三目运算符的中间返回值,效果和JS的||完全一致:
NSDictionary *selfInfo = @{ @"id": selfPartcipant.id, @"name": selfPartcipant.name ?: @"", @"picture": selfPartcipant.picture ?: @"", @"audioEnabled": @(selfPartcipant.audioEnabled), @"videoEnabled": @(selfPartcipant.videoEnabled), @"isPinned": @(selfPartcipant.isPinned) };
a ?: @"" 等价于 a != nil ? a : @"",当name或picture为nil时会自动替换为空字符串插入字典。
方案2:完整三目运算符写法(兼容所有编译器)
如果担心编译器不支持简写语法,可以写完整的三目判断:
@"name": selfPartcipant.name ? selfPartcipant.name : @"", @"picture": selfPartcipant.picture ? selfPartcipant.picture : @""
方案3:封装宏批量处理字段
如果需要处理的空值字段很多,可以提前定义统一的转换宏,减少重复代码:
// 放在头文件或者当前文件顶部定义 #define NilToString(val) (val ?: @"") // 构造字典时使用 NSDictionary *selfInfo = @{ @"id": selfPartcipant.id, @"name": NilToString(selfPartcipant.name), @"picture": NilToString(selfPartcipant.picture), @"audioEnabled": @(selfPartcipant.audioEnabled), @"videoEnabled": @(selfPartcipant.videoEnabled), @"isPinned": @(selfPartcipant.isPinned) };
注意:你代码中剩下的
audioEnabled/videoEnabled等字段用@()包装基础类型是安全的,即使基础类型值为NO/0,包装后得到的是合法的NSNumber对象,不会为nil,不会导致崩溃。
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

