我喜欢在Java中使用新的Optional
类。目标C中是否存在等效物?
我需要能够保存像nil
这样的小值的东西,直到我尝试获取它的值,此时它被初始化并且在下次读取它时缓存新值。在我尝试读取其值时,我不想检查对象是否为nil
。
答案 0 :(得分:3)
您可以使用getter延迟加载变量。
- (MyClass *) something {
if(!_something) {
_something = [MyClass new];
}
return _something;
}
因此,每次使用instance.something
时,它都会为您进行检查并加载对象(如果该对象已经存在)。
如果它是一个简单的单行并且你根本不想使用if
,你可以跳过关键字(我听说这更快,但无法验证那个):
- (MyClass *) something {
return _something ?: (_something = [MyClass new]);
}
答案 1 :(得分:0)
这与Swift中的展开非常类似,myObject?.aValue
仅在aValue
时才会返回myObject != nil
。或if let
声明:if let value = myObject?.aValue
在目标C中,没有专用于此的特定语法,但是您可以使用简单的if语句轻松测试存在,例如:if(myObject)
。因为Objective-C对象是指针而且NULL指针的地址是0x0,如果myObject
为NULL,则if语句将评估为false(如果您愿意,则为nil)。
如果您尝试读取nil对象的属性,则同样会获得nil
(对于也是对象的属性)。如果你试图设置一个零对象的属性,什么都不会发生。
我喜欢尽可能多地使用ternery运算符,例如:string != nil ? [textField setText:string] : NULL;
如前面的答案所示,您可以在特定情况下使用延迟实例化。