Swift中getter方法内的nil检查?

7

我的视图控制器中有一个数组。如果它为nil,应该分配空间,否则应返回现有的值。

Objective C等效代码:

- (NSArray*)states{
     if(!_states)
     {
         _states = //read files from json and assigned to array
     }
     return _states;
}

我需要在Swift中实现这个功能。我尝试使用存储属性,但无法实现。

有什么最好的方法可以实现这个功能?

3个回答

7
它可以是这样的东西:

它可能长成这个样子:

class Whatever {
    private(set) var _states: [AnyObject]?
    var states: [AnyObject] {
        get{
            if let st = _states {
                return st
            }
            else {
                // Read from file
                _states = ....
                return _states!
            }
        }
    }
}

在SWIFT中不存在实例变量的概念,只有属性。通过编写private(set) var _states: [AnyObject]?,我们表明_states不能从类外部写入,只能在内部写入。然后,我们创建一个只读属性,其职责是读取我们的_states,如果它不为null,则将其绑定到st,否则填充它的数据。
还有一种更SWIFTY的方法叫做惰性属性:
class Whatever {
    lazy var states: [AnyObject] = {
        return array read from file
    }()
}

使用lazy关键字,我们是在告诉程序只有在第一次调用该属性时才创建这个数组,一旦创建后它将不会再被重复创建,而是直接返回。这样就能够避免从文件中再次创建该数组。


1
我想使用延迟属性。例如,状态已加载,但在某个阶段后,由于文件已更新,我需要重新加载数组。在Objective C中,我只需为我的状态属性设置nil,然后它将从文件加载新的值集。同样的方式,我能否在这里遵循延迟属性? - jailani
不,一旦创建了懒加载属性,就不能将其设置为nil,您必须坚持第一个选项。 - Andrea
好的,谢谢你的回答。 - jailani

3

我们在Swift 3.0中也可以这样使用。

private var _designContentViewController: DesignContentViewController?

var designContentViewController: DesignContentViewController? {
    get {
        if _designContentViewController == nil {
            _designContentViewController = DesignContentViewController()
            self.view.addSubview((_designContentViewController?.view)!)
            _designContentViewController?.view.isHidden = true
            _designContentViewController?.view.backgroundColor = UIColor.white
        }
        return _designContentViewController

    }
    set {
        _designContentViewController = newValue
    }
}

2

您需要分两步走。首先,使用一个存储属性例如 _states 存储包含可选数组的值。然后,使用计算属性 states 访问 _states 可选数组并返回解包后的值或者首先加载 _states。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接