2017-06-03 11 views
1

同じことをするために、遅延プロパティと関数を2つ作成しました。今はそののgreetLazyの値はが最初にアクセスされたときにのみ計算されるので、私がperson.greetLazyを使用してアクセスすると、それが意味すると思われるものがコンソールに表示されます。怠惰なプロパティとSwiftの関数3

私のここでの質問は関数の場合にも、私が関数にアクセスする場合にのみ値が返されます。それはあらかじめ計算されていません。では、その2つの違いは何でしょうか?

答えて

6

Swiftの遅延プロパティの完全名は遅延保存プロパティです。つまり、プロパティの値は、最初に必要なときに計算されるとすぐに保存されます。同じプロパティを再度参照すると、追加の計算は実行されません。

一方、関数の結果は、関数を呼び出すたびに計算されます。 "Computing func..."が重複して印刷されている間、一度だけ"Computing 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()) 

:ここ

は、この点を示し、あなたの変更されたコードです。

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 

は違いは、自明である、それはないですか?それは

Hello alpha 
Hello beta 

を印刷し

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

名を継続して変更することができますか

another example

+0

他の例は素晴らしいです:) –

関連する問題