如果存在,计算变量返回 self,如果 nil 则返回新实例

Posted

技术标签:

【中文标题】如果存在,计算变量返回 self,如果 nil 则返回新实例【英文标题】:Computed variable return self if exists or new instance if nil 【发布时间】:2017-05-19 00:33:02 【问题描述】:

如果我的应用有 ScoreModel,我需要将其传递给下一个 UIViewController。它可能不存在,因此不会传递给这个新的UIViewController。如果是这种情况,我想让它创建一个模型的新实例。这不起作用(无休止的循环),但它会给出我想要创建的想法:

var scoreModel : ScoreModel! 
    get 
        if self.scoreModel == nil 
            return ScoreModel()
         else 
            return self.scoreModel
        
    
    set 
        self.scoreModel = newValue
    

如何在不进入循环的情况下检查scoreModel == nil 的当前版本?

【问题讨论】:

听起来你想要一个惰性变量。在这里阅读:alisoftware.github.io/swift/2016/02/28/being-lazy 【参考方案1】:

如果您不尝试使用自定义 getter/setter,而是将 scoreModel 属性设置为可选(无论如何更好的约定),并且当您想将其传递给下一个视图控制器时,您会检查它是否为 nil。像这样:

var scoreModel: ScoreModel?
let nextViewController = UIViewController()
nextViewController.scoreModel = scoreModel ?? ScoreModel()

【讨论】:

【参考方案2】:

其实你说的是惰性初始化变量

lazy var scoreModel = ScoreModel()

第一次访问变量时调用初始化器。

【讨论】:

是的,但我想知道在创建之前它是否还没有被以前的 ViewController 传递:-)【参考方案3】:

你可以像这样使用惰性变量:

class Test 


   lazy var scoreModel: ScoreModel = 
        return ScoreModel()
    ()



let test = Test()
test.scoreModel = ScoreModel()

【讨论】:

这不会创建一个新实例吗?

以上是关于如果存在,计算变量返回 self,如果 nil 则返回新实例的主要内容,如果未能解决你的问题,请参考以下文章

headerViewForSection:如果 Header View 或 section 在 iphone 上不可见,则返回 nil

实例变量访问(通过 self)导致空指针取消引用

Javascript / Typescript如果变量存在则返回如果不返回其他内容[重复]

如果不是 Nil,则变量重新分配方法结果

MSIL实用指南-返回结果

查询如何在 Vapor 中工作?