【问题标题】:nil check inside getter method in swift?快速检查getter方法内部?
【发布时间】:2016-07-01 22:47:42
【问题描述】:

我的视图控制器中有一个数组。只有当它为 nil 时才应该分配它,否则它应该返回现有值。

Objective C 等效项:

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

我必须迅速做到这一点。我尝试使用存储属性,但无法实现这一点

实现这一目标的最佳方法是什么

【问题讨论】:

    标签: arrays swift properties


    【解决方案1】:

    可能是这样的:

    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,如果它不是 nil 或用数据填充它,则将其绑定到st
    有一种更快捷的方法可以做到这一点,称为惰性属性:

    class Whatever {
        lazy var states: [AnyObject] = {
            return array read from file
        }()
    }
    

    通过使用惰性,我们说只在第一次调用属性时创建该数组,一旦设置它就永远不会再次创建,而只是返回。基本上它不会再次从文件传递给数组创建。

    【讨论】:

    • 我想使用惰性属性。例如,状态已加载,但在某个阶段后我需要再次加载数组,因为文件已更新。在目标 C 中,我将为我的 states 属性设置 nil,然后它将从文件中加载新的一组值。以同样的方式,我可以在惰性属性中关注这里吗?
    • 不,一旦创建你就不能 nil 一个惰性属性,你必须坚持第一个选项
    • 好的,谢谢您的回答
    【解决方案2】:

    我们也可以这样使用,在 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
        }
    }
    

    【讨论】:

      【解决方案3】:

      你分两步走。您使用像 _states 这样的存储属性,其中包含一个可选数组。然后你有一个计算属性 states 它访问 _states 可选数组并返回解包值或首先加载 _states。

      【讨论】:

        猜你喜欢
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 2016-01-26
        • 2019-01-10
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多