2016-08-16 4 views
0

以下の概念を正しく理解しているかどうかを明確にしたいと思います。計算されたプロパティの利点(取得可能なもののみ)対ストアドプロパティ

String"Good morning, Mike"を変数var sayGoodMorningToUserに格納することを目標とします。

Stringはすなわち

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

私は他の言葉で、計算されたプロパティ対保存されたプロパティを使用している場合、それはどのような違いを生むん、二つの変数で構成されています

var sayGoodMorningToUserStored = greeting + username 

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

私がこれらの2つのアプローチの間に見る唯一の違いは、誰でも変更できることですsayGoodMorningToUserStoredの値は、簡単かつ直接的に、例えば、

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

人々は、単に変数を計算する代わりに、なぜそうしないと、私は理解することはできません。それは単に新しい文字列値に設定することはできませんので、変数sayGoodMorningToUserComputedは、直接変更することはできません一方

var sayGoodMorningToUserStored = "myNewChangedValue" 

を書き込むことにより、書く

var sayGoodMorningToUserStored = greeting + username. 

私はそれを正しく理解すれば誰でも説明できますか?あるいは、計算された変数と保存された変数の利点は他にありますか?

ここで設定可能な変数について議論すると、スコープを超えてしまうため、私はgettable変数のみに制限したいと思います。

+0

計算されたプロパティの目的は、それを一度宣言し、 'username'が変更されたときに、計算された" greeting "プロパティが自動的に更新されてそれを反映します。したがって、 'username'が変更された場合、' sayGoodMorningToUserStored'も更新することを覚えておく必要はありません。あなたがコード中の他の場所を参照すると、 'sayGoodMorningToUserStored'が最初に宣言されたときの' username'ではなく 'username'の現在の値が自動的に反映されます。 – Rob

+0

私が今考えている主な違いは、プロトコルとプロトコルの拡張です。プロトコルでは状態を保持できないため、計算値が最適です。 – jonmecer

+0

@Pisanあなたの質問が満足されていると感じたら、受け入れられたように質問にレートを付けてください。 – Alexander

答えて

1

コンピュープロパティ

var sayGoodMorningToUserComputed: String { 
    return greeting + username 
} 

sayGoodMorningToUserComputed行為を。 greetingまたはusernameに変更された場合、sayGoodMorningToUserComputedは現在の値の連結となる最新の結果を返します。

戻り値が依存関係(greetingおよびusername)の最新の値から計算されるようにする場合は、これを使用します。それは依存関係が

ストアドプロパティを変更することはできません知っているので、両方の依存性がfinalをしている場合には

は、それは、コンパイラが保存されたプロパティには、この計算されたプロパティを最適化することを非常に可能性があります

var sayGoodMorningToUserStored = greeting + username 

sayGoodMorningToUserStoredは単なる変数で、何も特別なことはありません。ただし、スコープが含まれている場合は、一度だけ設定されます。これは一度計算され、保存され、外部ソースによって上書きされるまで一定のままです。したがって、greetingまたはusernameが変更された場合、古い値から計算されて保存されているため、sayGoodMorningToUserStoredには何の影響もありません。

依存関係が一定である計算結果をキャッシュしてパフォーマンスを向上させたい場合は、これを使用します。

+0

この男には気をつけてください。 – ospahiu

2

あなたの例の違いはこれです:

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

たびに評価されます:あなたのクラスが初期化されるときに、これは一方で

var sayGoodMorningToUserStored = "myNewChangedValue" 

var sayGoodMorningToUserStored = greeting + username 

は、設定されていますプロパティにアクセスします。

単純な例は、firstNamelastNameを持つクラスですが、fullNameも必要です。通常のプロパティを使用して、firstNameまたはlastNameを更新するたびに、一致するようにfullNameも更新する必要があります。計算されたプロパティを使用すると、fullNameにアクセスするたびに最新の情報が得られます。ただ機能のような

関連する問題