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
差异不言自明,不是吗?
见
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
差异不言自明,不是吗?
见