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

Swift:将协议变量实现为惰性变量?,swift,lazy-evaluation,Swift,Lazy Evaluation,似乎不可能用惰性变量实现协议所需的变量。例如: protocol Foo { var foo: String { get } } struct Bar: Foo { lazy var foo: String = "Hello World" } 编译器抱怨类型“Bar”不符合协议“Foo” 也不可能在协议声明中添加lazy关键字,因为您得到“lazy”在协议要求上是不允许的错误 那么这根本不可能吗?引用[强调我的]: 惰性存储属性是初始值不为的属性 计算到第一次使用时为止 即,该值在第

似乎不可能用惰性变量实现协议所需的变量。例如:

protocol Foo {
  var foo: String { get }
}

struct Bar: Foo {
  lazy var foo: String = "Hello World"
}
编译器抱怨
类型“Bar”不符合协议“Foo”

也不可能在协议声明中添加
lazy
关键字,因为您得到
“lazy”在协议要求上是不允许的
错误

那么这根本不可能吗?

引用[强调我的]:

惰性存储属性是初始值不为的属性 计算到第一次使用时为止

即,该值在第一次使用时发生变化。由于
foo
已在
foo
协议中被蓝印为
get
,隐式地
nonmutating get
,因此值类型
Bar
与其
lazy
属性
foo
(一个带有
变异
getter的属性)不符合这一承诺

protocol Foo {
    var foo: String { mutating get }
}

struct Bar: Foo {
    lazy var foo: String = "Hello World"
}
Bar
更改为引用类型将允许它实现
Foo
蓝图(因为更改引用类型的属性不会更改类型实例本身):

或者,在
foo
foo
属性的蓝图中指定它有一个
mutating
getter

protocol Foo {
    var foo: String { mutating get }
}

struct Bar: Foo {
    lazy var foo: String = "Hello World"
}

有关getter和setter的
变异
/
非变异
说明符的更多详细信息,请参见以下问答:


非常感谢您快速而详细的回答!