1. ホーム
  2. ios

[解決済み] Swiftのプロトコルでletが使えないのはなぜですか?

2023-05-27 19:42:57

質問

Swiftのプロトコルについて疑問があります。 var keywords { get set } とする。 .

から アップルのドキュメント :

あるプロトコルで、あるプロパティがgettableとsetableであることが要求されている場合 定数保存されたプロパティや読み取り専用の計算されたプロパティでは満たすことができません。 や読み取り専用の計算されたプロパティでは満たすことができません。プロトコルが プロパティが取得可能であることのみを要求する場合、その要求はどのような種類のプロパティでも満たすことができます。 また、そのプロパティが設定可能であることも有効です。 これはあなた自身のコードのために有用であるなら、プロパティはまた設定可能であるために有効です。

プロパティ要件は常に変数プロパティとして宣言されます。 をプレフィックスとする変数プロパティとして宣言されます。取得可能なプロパティと設定可能なプロパティは 型宣言の後に { get set } と記述することで示されます。 gettableプロパティは{ get }と記述することで示される。

を使用できない理由がわかりません。 を使うのでしょうか? . A ヴァル だけで構成されるプロトコルで を得る だけではありません。 let ?

このようなものです。

protocol someProtocol 
{
   var someProperty: String { get }
}

というのは、正当なことではありません。

protocol someProtocol 
{
   let someProperty: String
}

何か見逃してる?

どのように解決するのですか?

"getだけのプロトコルのvarは、ただのletではないのですか?"。 いいえ、A let は定数を表します。しかし、ここではそうではありません。次のように考えてみましょう。

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 を実装することはできませんが、同様に設定可能にする必要があります。

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