Swift:将协议变量实现为惰性变量?

问题描述 投票:11回答:1

看来,使用惰性变量实现协议所需的变量是不可能的。例如:

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错误。

这根本不可能吗?

swift lazy-evaluation
1个回答
22
投票

引用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

另外,在Foomutating属性的蓝图中指明它有一个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说明符的一些其他详细信息,请参阅以下问答:

  • qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.