2016-08-16 39 views
0

我想澄清一下,如果我正確理解以下概念。計算屬性的好處(僅可獲取的屬性)與存儲的屬性

假設我的目標是將String"Good morning, Mike"存儲到變量var sayGoodMorningToUser中。

的字符串是由兩個變量,即

var greeting = "Good morning, " 
var username = "Mike" 

的這有什麼區別,如果我使用的存儲性能與計算性能,換句話說:

var sayGoodMorningToUserStored = greeting + username 

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

我在這兩種方法之間唯一的區別是任何人都可以改變sayGoodMorningToUserStored的值可以容易且直接地存儲,例如通過寫

var sayGoodMorningToUserStored = "myNewChangedValue" 

而可變sayGoodMorningToUserComputed不能直接修改的,因爲它不能簡單地將其設置爲一個新的字符串值:

var sayGoodMorningToUserComputed = "Hallo" //this would cause an error 

否則,我不明白爲什麼人們計算的變量,而不是簡單地寫作

var sayGoodMorningToUserStored = greeting + username. 

任何人都可以解釋,如果我理解正確嗎?或者還有計算變量與儲存變量的其他優點?

我想限制我的問題僅限於gettable變量,因爲討論這裏的可設置變量將超出範圍。

+0

計算屬性的用途是您聲明一次,並且當「用戶名」更改時,計算的「問候」屬性將自動更新以反映該屬性。所以如果'用戶名'改變了,你不必記得更新'sayGoodMorningToUserStored'。如果你在你的代碼中的其他地方引用它,它會自動地反映'username'的當前值,而不是'sayGoodMorningToUserStored'第一次聲明時的'username'。 – Rob

+0

我現在能想到的主要區別在於協議和協議擴展。由於協議不能保持狀態,所以計算值最好。 – jonmecer

+0

@Pisan如果您覺得您的問題已得到滿足,請評價爲已接受的問題。 – Alexander

回答

1

計算屬性

var sayGoodMorningToUserComputed: String { 
    return greeting + username 
} 

sayGoodMorningToUserComputed的行爲就像一個功能。如果對greetingusername進行了更改,則sayGoodMorningToUserComputed將返回最新結果,該結果將成爲當前值的串聯。

如果您想確保您的返回值是從其依賴關係的最新值(greetingusername)計算出來的,您可能會想使用它。

在這兩個依賴是final的話,那麼它很可能是編譯器會優化這種計算性能爲存儲的屬性,因爲它知道的依賴性無法改變

存儲性能

var sayGoodMorningToUserStored = greeting + username 

sayGoodMorningToUserStored只是一個變量,沒有什麼特別的事情發生。但是,只有在包含的範圍被初始化時,它纔會被設置一次。它被計算一次,存儲並保持不變,直到它被外部源覆蓋。因此,如果greetingusername發生更改,將不會對sayGoodMorningToUserStored產生影響,因爲它是根據舊值計算並存儲的。

如果要通過緩存依賴性恆定的計算結果來提高性能,您可能需要使用此選項。

+0

給這個男人一個該死的複選標記。 – ospahiu

2

在你的例子不同的是這樣的:

var sayGoodMorningToUserStored = "myNewChangedValue" 

var sayGoodMorningToUserStored = greeting + username 

是當你的類初始化設置,而這一點:

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

評估每次財產被訪問。

簡單的例子是一個類有firstNamelastName,但也想要fullName。使用普通屬性,每次更新firstNamelastName時,您還必須更新fullName以便匹配。使用計算屬性,每次訪問fullName時,都會獲得最新的信息。