web-dev-qa-db-ja.com

プロトコルの変数のセットに準拠して取得する方法は?

プロトコルとそれらに準拠する方法で遊んでいます。

protocol Human {    
    var height: Int {get set}    
}

struct boy : Human { 
    var height: Int  {return 5} // error!
}

Setとgetを実装できるさまざまな方法を学ぼうとしています。ただし、上記のコードは次のエラーをスローします。

タイプ「boy」はプロトコル「Human」に準拠していません

ただし、次のように記述してもエラーは発生しません。

struct boy : Human { 
    var height = 5 // no error
}

変数をsetすることもできる場合、その違いも、何を正確に実装する必要があるかも理解できません。私はさまざまな質問とチュートリアルを調べましたが、それらはすべて、単に詳細な説明なしで書いて行きます。

EDIT:Imanouの答えが表示されていることを確認してください here 。さまざまなシナリオを大きく説明しています。

11
Honey

Swift Reference から:

プロパティ要件

...
プロトコルは、プロパティを保存プロパティと計算プロパティのどちらにするかを指定しません。必要なプロパティ名とタイプのみを指定します。
...
プロパティ要件は、常に変数プロパティとして宣言され、varキーワードのプレフィックスが付きます。取得可能なプロパティと設定可能なプロパティは、{ get set }は型宣言の後、取得可能なプロパティは{ get }

あなたの場合

var height: Int  {return 5} // error!

計算されたプロパティgetのみであり、のショートカットです

var height: Int {
    get {
        return 5
    }
}

ただし、Humanプロトコルには、取得および設定可能なプロパティが必要です。保存されたvariableプロパティに準拠できます(お気づきのように):

struct Boy: Human { 
    var height = 5
}

または、ゲッターとセッターの両方がである計算プロパティを使用:

struct Boy: Human { 
    var height: Int {
        get {
            return 5
        }
        set(newValue) {
            // ... do whatever is appropriate ...
        }
    }
}
29
Martin R