我最近一直在学习 ruby,并且基本上喜欢 ||= 功能,因为它会让在 Objective C 中编写惰性 getter 变得更加容易。
目前我编写吸气剂,例如:
- (NSArray *)myArray {
if (!_myArray) {
_myArray = [NSArray array];
}
return _myArray
}
除非我缺少 ||= 的某些内容,否则我可以使用 Ruby 编写前面的代码:
- (NSArray *)myArray {
return _myArray ||= [NSArray array];
}
这显然干净得多。 Objective-C 语言/运行时中是否有任何东西可以让您做到这一点?
另外,以下是吸气剂的单行三元,我不确定它是否与上面发布的经过尝试的真实方法(第一个片段)一样有效。有人可以告诉我这样做是否有什么问题:
- (NSArray *)myArray {
return _myArray = _myArray ? _myArray : [NSArray array];
}
最后一个片段与您发布的第一个片段具有相同的效果。
作为一种改进,虽然没有像这样的运算符||=
在 Objective-C 中,您可以省略三元 if 运算符的第二个参数并执行
return _myArray = _myArray ?: [NSArray array];
这完全相当于
return _myArray = _myArray ? _myArray : [NSArray array];
这是现代版本都支持的语言扩展gcc http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Conditionals.html#Conditionals and clang http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html.
奖励:如果你想节省更多的击键次数,你可以这样做
- (NSArray *)myArray {
return _myArray = _myArray ?: @[];
}
附带说明一下,跳过中间操作数也有一些好处。
例如在本例中
id x = [self someMethod] ? [self someMethod] : [self anotherMethod];
if someMethod
评估为true
它将被调用两次,而做
id x = [self someMethod] ?: [self anotherMethod];
它只会被调用一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)