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
(具有mutating
getter 的属性)来实现此承诺.
更改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
它有一个mutating
getter.
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 次 |
最近记录: |