2015-12-20 10 views
35

varキーワード{get set}の使用については、Swiftのプロトコルについては疑問があります。 Apple documentationからSwiftでlet in protocolを使用できないのはなぜですか?

プロトコルは 性要件を一定に格納されたプロパティ または読み取り専用計算プロパティで満たすことができないこと、gettableと設定可能であること性を必要とする場合。プロトコルで プロパティの取得のみが必要な場合は、任意の種類のプロパティー( )で要件を満たすことができ、 が独自のコードに役立つ場合は、プロパティを設定することも有効です。

プロパティの要件は常に可変プロパティとして宣言され、 の接頭辞はvarキーワードです。 gettableプロパティとsettableプロパティは、型宣言の後に{get set}を書くことによって示された であり、 gettableプロパティは{get}と書かれています。

私はを聞かせて使用することはできませんなぜ私が理解することはできません。 varのみのプロトコルでを取得するは、ではありません。を入力してください。このような

何か:

protocol someProtocol 
{ 
    var someProperty: String { get } 
} 

それだけではないでしょう。

protocol someProtocol 
{ 
    let someProperty: String 
} 

私は何かが欠けていますか?

+4

gettableプロパティは値を変更することができます。プロトコル実装者は常に異なる値を返すことができ、プロトコル呼び出し側は単にそれらを設定できません。一方、定数を定義する。一度しか設定できず、異なる値を持つことはできません。 – pvg

+1

@pvg、なぜこれを回答として投稿していないのですか? – courteouselk

+0

これは正解です。 – sunshinejr

答えて

35

"getだけのプロトコルのvarは単なるレットではありませんか?" No.Aletは定数を示す。しかし、ここではそうではありません。次のことを考えてみましょう:

protocol SomeProtocol { 
    var someProperty: String { get } 
} 

class SomeClass : SomeProtocol { 

    var someProperty: String = "" 

    func cla() { 
     someProperty = "asd" 
    } 
} 

let someInstance = SomeClass() 

print(someInstance.someProperty) // outputs "" 
someInstance.cla() 
print(someInstance.someProperty) // outputs "asd" 

プロトコルが準拠クラスを外部に表示するものを指定します - あなたは少なくともを得ることができますsomeProperty名前付きの型Stringのいくつかのプロパティを。

プロトコルで{ get }が指定されている場合は、クラスはlet someProperty: String = ""で準拠することを選択できますが、同様に上記のコードを遵守することができます。一方、プロトコルに{ get set }が指定されている場合、実装ではletを使用できませんが、設定可能にする必要があります。

プロトコルでは、値が一定である必要があると定義することはできません。実装するクラス/構造体によって注意(または決定)されなければならない実装の詳細です。意味をなさないれ

protocol MyProtocol { 
    let someProperty: String 
} 

+0

それはとてもシンプルで明白でした。プロトコルは機能(プロパティ)だけが許されていますが、私はいつも質問して疑問を解決する方が好きです。今では '{get set}'の使用はこれまでどおりにはっきりしています、ありがとうございます! –

21

違いがある - プロトコルはsomePropertyは、それがプロパティとして利用できるだけことを、/定義されて保存されているかを決定することになっていません。それは計算されたプロパティでもストアされたプロパティでも構いませんが、それはプロトコル自体ではなく、実装者が決定するためのものです。

と完全に許可されている

protocol MyProtocol { 
    var someProperty: String { get } // abstract interface 
} 

struct MyStruct: MyProtocol { 
    let someProperty: String // concrete implementation: stored property 
} 

struct OtherStruct: MyProtocol { 
    let i: Int 
    var someProperty: String { return "\(i)" } // concrete implementation: computed property 
} 

関連する問題