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

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

引用语言指南 - 属性 - 惰性存储属性 [ 强调我的]:

惰性存储属性是一个属性,其初始值在第一次使用之前不会计算.

即,该值在首次使用时发生变异.由于fooFoo协议中已经蓝图,因为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说明符的一些其他详细信息,请参阅以下问答:

  • 非常感谢您快速而详细的回答! (3认同)