【问题标题】:lazy properties vs function in Swift 3Swift 3 中的惰性属性与函数
【发布时间】:2017-11-04 18:13:26
【问题描述】:
    struct Person
    {
        var personName:String?
        init(name:String) {
              personName=name
        }

    lazy var greetLazy:String =
    {
            return "Hello \(self.personName!)"
    }()

    func greetFunc()->String
    {
        return "Hello \(self.personName!)"
    }
}

var person:Person=Person(name:"")
print(person.greetLazy)
print(person.greetFunc())

我创建了两件事,即一个惰性属性和一个函数来做同样的事情。现在它说 greetLazy 的值只会在第一次访问时计算,所以当我使用 person.greetLazy 访问它时,它会打印到控制台,这就是懒惰的假设意思是。

我的问题是在函数的情况下,只有当我访问函数时才会返回值。它不会预先计算它。那么在这种情况下,两者之间有什么区别?

【问题讨论】:

    标签: swift function lazy-evaluation


    【解决方案1】:
    struct Person
    {
        var personName:String?
        init(name:String) {
              personName=name
        }
    
    lazy var greetLazy:String =
    {
            return "Hello \(self.personName!)"
    }()
    
    func greetFunc()->String
    {
        return "Hello \(self.personName!)"
    }
    }
    
    var person:Person=Person(name:"alpha")
    print(person.greetLazy)
    print(person.greetFunc())
    

    打印

    Hello alpha
    Hello alpha
    

    让我们继续并更改名称

    person.personName = "beta"
    print(person.greetLazy)
    print(person.greetFunc())
    

    打印出来

    Hello alpha
    Hello beta
    

    区别是不言自明的,不是吗?

    another example

    【讨论】:

    • 另一个例子是好伙伴:)
    【解决方案2】:

    Swift 中惰性属性的全称是惰性存储属性,意思是属性的值在第一次需要计算的时候就被存储。当您再次引用相同的属性时,不会执行额外的计算。

    另一方面,每次调用函数时都会计算函数的结果。

    这是您修改后的代码,可以证明这一点:

    struct Person {
        var personName:String?
        init(name:String) {
            personName=name
        }
    
        lazy var greetLazy:String = {
            print("Computing property...")
            return "Hello \(self.personName!)"
        }()
    
        func greetFunc()->String
        {
            print("Computing function...")
            return "Hello \(self.personName!)"
        }
    }
    
    var person:Person=Person(name:"")
    print(person.greetLazy)
    print(person.greetFunc())
    print(person.greetLazy)
    print(person.greetFunc())
    

    上面只打印一次"Computing property...",而"Computing func..." 打印两次。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2017-10-29
      • 2014-11-20
      • 2015-03-18
      • 1970-01-01
      • 2018-06-11
      • 2015-05-15
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多