Kev*_*ers 16 lazy-evaluation swift
看来,使用惰性变量实现协议所需的变量是不可能的.例如:
protocol Foo {
var foo: String { get }
}
struct Bar: Foo {
lazy var foo: String = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说Type 'Bar' does not conform to protocol 'Foo'.
也无法lazy在协议声明中添加关键字,因为这样会'lazy' isn't allowed on a protocol requirement出现错误.
这根本不可能吗?
dfr*_*fri 31
引用语言指南 - 属性 - 惰性存储属性 [ 强调我的]:
惰性存储属性是一个属性,其初始值在第一次使用之前不会计算.
即,该值在首次使用时发生变异.由于foo在Foo协议中已经蓝图,因为get隐式地nonmutating get,值类型Bar不能通过其lazy属性foo(具有mutatinggetter 的属性)来实现此承诺.
更改Bar为引用类型将允许它实现Foo蓝图(因为变更引用类型的属性不会改变类型实例本身):
protocol Foo {
var foo: String { get }
}
class Bar: Foo {
lazy var foo: String = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)
另外,在foo属性的蓝图中指定Foo它有一个mutatinggetter.
protocol Foo {
var foo: String { mutating get }
}
struct Bar: Foo {
lazy var foo: String = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)
有关getter和setter 的mutating/ nonmutating说明符的一些其他详细信息,请参阅以下问答:
| 归档时间: |
|
| 查看次数: |
3096 次 |
| 最近记录: |