【问题标题】:Swift function vs lazy var vs computed property - difference?Swift 函数 vs 惰性变量 vs 计算属性 - 区别?
【发布时间】:2018-06-11 12:21:44
【问题描述】:

以下有区别吗:

惰性变量:

lazy var profileImageIsLoaded : Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

功能:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

计算属性:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

什么方法最好用?

我会多次调用函数/变量,所以我的问题也是惰性变量是否被“更新”或者它们是否只获得一次值。

【问题讨论】:

  • 惰性变量只分配一次,当第一次访问该值时。每次访问它们时都会计算计算变量。函数是计算变量的更复杂版本,可以传递参数、赋值给局部属性等。

标签: swift


【解决方案1】:

第一个:

lazy var profileImageIsLoaded: Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

profileImageIsLoaded 是一个使用闭包延迟初始化的存储属性,一旦变量被初始化,这个闭包将不再被调用,并返回第一次调用闭包时的值。

第二个:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

是一个普通的函数声明,这只是声明。如果你想调用那个函数,你可以这样做:profileImageIsLoaded()

第三个:

var profileImageIsLoaded: Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

profileImageIsLoaded是一个计算属性,每次访问这个属性都会被计算并返回。

选择使用哪一个始终取决于您的情况。

【讨论】:

  • 很好的解释
  • 很高兴它对您有所帮助!
【解决方案2】:
  • lazy vars 实际上是存储的属性,所以你不能把它放在扩展或任何不允许存储属性的地方。
  • 计算属性的 getter 每次在您引用该属性时都会运行。这可能很重要,尤其是在 getter 耗时或对代码的其他部分有副作用的情况下。
  • lazy vars 的 getter 仅在第一次引用该属性时运行,并且不再运行。
  • lazy vars 是变量。你可以改变它们。
  • 计算属性可以可选地有一个设置器,所以有时它们是只读的。
  • 使用这样的函数与只读计算属性非常相似。您只需在获取其值时添加()

【讨论】:

  • 是否存在可选的惰性变量,它们会做什么,或者这完全是另一个话题?
  • @T.Meyer 它们只是惰性变量,但它们是可选类型。不同的是你可以在闭包中返回nil
  • @t-meyer :当您希望在变量的整个生命周期中仅初始化一次变量时,您将使用惰性 var。假设你想设置 NSFetchedResultsController,你希望它在 ViewController 的整个生命周期中只被初始化一次,在这种情况下你可以使用惰性 var。如果你不使用lazy var,那么如果条件检查变量是否都被初始化或者不像我们在objective Clazy var中那样是干净且更简单的解决方法
  • 关于惰性变量的另一重要注意事项是它们不是线程安全的。如果两个线程同时尝试访问惰性变量,可能会导致计算两次。
  • @Sweeper:+1 获取正确信息。我还有一个疑问,哪一个在编译方面效率更高?
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2016-05-20
  • 2019-03-28
  • 1970-01-01
  • 2017-11-04
  • 2016-05-11
相关资源
最近更新 更多