遅延変数を使用して、プロトコルで必要な変数を実装することはできないようです。例えば:
protocol Foo {
var foo: String { get }
}
struct Bar: Foo {
lazy var foo: String = "Hello World"
}
コンパイラはType 'Bar' does not conform to protocol 'Foo'
と不平を言います。
また、プロトコル宣言にlazy
キーワードを追加することもできません。その場合、'lazy' isn't allowed on a protocol requirement
エラーが発生します。
これはまったく不可能ですか?
引用 言語ガイド-プロパティ-遅延保存プロパティ [emphasismine]:
遅延保存プロパティは、最初に使用されるまで初期値が計算されないプロパティです。
つまり、値は最初の使用時にmutatedになります。 foo
はFoo
プロトコルでget
として設計されているため、暗黙的にnonmutating get
、値タイプBar
は、lazy
プロパティfoo
、mutating
ゲッターを持つプロパティでは、この約束を満たしません。
Bar
を参照型に変更すると、Foo
ブループリントを満たすことができます(参照型のプロパティを変更しても型インスタンス自体は変更されないため)。
protocol Foo {
var foo: String { get }
}
class Bar: Foo {
lazy var foo: String = "Hello World"
}
または、foo
のFoo
プロパティのブループリントで、mutating
ゲッターがあることを指定します。
protocol Foo {
var foo: String { mutating get }
}
struct Bar: Foo {
lazy var foo: String = "Hello World"
}
ゲッターおよびセッターのmutating
/nonmutating
指定子の詳細については、次のQ&Aを参照してください。