【问题标题】:Swift lazy stored property versus regular stored property when using closure使用闭包时的 Swift 惰性存储属性与常规存储属性
【发布时间】:2015-11-24 18:39:30
【问题描述】:

在 Swift 中,我们可以设置一个存储属性来使用闭包:

class Test {
  var prop: String = {
    return "test"
  }()
}

或者让惰性存储属性使用闭包:

class Test {
  lazy var prop: String = {
    return "test"
  }()
}

在这两种情况下,用于获取属性值的代码只运行一次。似乎它们是等价的。

在使用闭包时,我应该什么时候使用惰性存储属性而不是计算属性?

【问题讨论】:

  • 其实都是存储属性,不是计算属性。
  • 正如 Martin 所说,两者都是存储属性。在创建类 Test 的实例时评估第一个的值。第二个是惰性的,当您的代码第一次需要它的值时,它会“按需”评估。
  • @MartinR 感谢您的更正,将解决问题。

标签: swift closures lazy-evaluation


【解决方案1】:
import Foundation
struct S {
    var date1: NSDate = {
        return NSDate()
    }()
    lazy var date2: NSDate = {
        return NSDate()
    }()
}

var s = S()
sleep(5)
print( s.date2, s.date1)
/* prints

2015-11-24 19:14:27 +0000 2015-11-24 19:14:22 +0000

*/

两者都是存储属性,请检查评估它们的实时时间。当第一次需要该值时,惰性属性会被“按需”评估

【讨论】:

  • 使用当前时间的好例子。
  • 在创建类 Test 的实例时如何检查第一个的值是否被评估,Swift 3 不允许在 Struct 中使用 print func,谢谢
  • @Rishi 对不起,我不明白你的问题,请尝试解释一下
猜你喜欢
  • 2017-10-29
  • 1970-01-01
  • 2019-04-04
  • 2013-08-30
  • 2014-12-28
  • 2014-08-02
  • 2015-09-16
  • 2023-03-19
  • 2017-06-11
相关资源
最近更新 更多