86

varキーワード { get set }の使用について、Swift のプロトコルについて疑問があります。

Appleのドキュメントから:

プロトコルがプロパティを取得および設定可能にする必要がある場合、そのプロパティ要件は、定数格納プロパティまたは読み取り専用の計算プロパティでは満たすことができません。プロトコルがプロパティを取得可能にすることのみを必要とする場合、その要件はあらゆる種類のプロパティによって満たすことができ、これが独自のコードに役立つ場合は、プロパティが設定可能であることも有効です。

プロパティ要件は、常に変数プロパティとして宣言され、var キーワードがプレフィックスとして付けられます。取得可能および設定可能なプロパティは、型宣言の後に { get set } と書くことで示され、取得可能なプロパティは { get } と書くことで示されます。

letが使えない理由がわかりません。getのみを使用するプロトコルのvarは、 letだけではありませんか?

このようなもの:

protocol someProtocol 
{
   var someProperty: String { get }
}

それはただではありません:

protocol someProtocol 
{
   let someProperty: String
}

何か足りない?

4

4 に答える 4

75

「get しかないプロトコルの var は let だけではないのですか?」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"

プロトコルは、準拠するクラスが外部に示すものを指定します-少なくとも取得できるString名前付きのタイプのプロパティ。someProperty

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

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

于 2015-12-20T21:26:26.213 に答える
1

with で宣言されたプロパティは内部的にlet考慮read-onlyされます。このため、プロトコルは、プロパティを読み取り専用に設定することにより、プロパティが定数であることを要求できます。Objcこの推定は、いくつかのランタイム関数を使用して検証できます property_getAttributes

protocol SomeProtocol {
    var someTypeProperty: Int { get }
}

struct Foo: SomeProtocol {
    let someTypeProperty: Int
}
于 2021-05-29T13:22:41.723 に答える