Swift 3 中的惰性属性与函数

lazy properties vs function in Swift 3

    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())

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

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

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

另一方面,函数的结果是在您每次调用该函数时计算的。

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

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..." 打印两次。

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

差异不言自明,不是吗?