Objective C中是否有可选变量?

时间:2015-03-30 18:23:38

标签: objective-c optional

我喜欢在Java中使用新的Optional类。目标C中是否存在等效物?

我需要能够保存像nil这样的小值的东西,直到我尝试获取它的值,此时它被初始化并且在下次读取它时缓存新值。在我尝试读取其值时,我不想检查对象是否为nil

2 个答案:

答案 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;

如前面的答案所示,您可以在特定情况下使用延迟实例化。