2017-06-03 36 views
1

我創建了2個東西,即一個懶惰屬性和一個函數來做同樣的事情。現在,它說,它的第一個訪問時greetLazy的價值纔會被計算,所以當我使用person.greetLazy訪問它,它打印到是應該的意思懶惰的consoleand多數民衆贊成。Swift 3中的懶惰屬性vs函數

我在這裏的問題是,在功能的情況下也值將只有當我訪問函數返回。它不會預先計算它。因此,這將是兩人在這種情況下,有什麼區別?

回答

6

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

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

+0

另一個例子是偉大的好友:) –