Swift 3中的延迟属性与函数

时间:2017-06-03 12:44:09

标签: swift function lazy-evaluation

    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 访问它时,它会打印到控制台,这就是懒惰的假设意思是。

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

2 个答案:

答案 0 :(得分:6)

Swift中lazy属性的全名是 lazy stored property ,这意味着在第一次需要时计算属性的值。再次引用同一属性时,不会执行其他计算。

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

以下是您修改后的代码,用于说明这一点:

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

答案 1 :(得分:0)

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