看来,使用惰性变量实现协议所需的变量是不可能的。例如:
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
错误。
这根本不可能吗?
引用the Language Guide - Properties - Lazy Stored Properties [强调我的]:
惰性存储属性是一个属性,其初始值在第一次使用之前不会计算。
即,该值在首次使用时发生变异。由于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
有关getter和setter的nonmutating
/ Swift mutable set in property说明符的一些其他详细信息,请参阅以下问答: