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的
变异
/非变异
说明符的更多详细信息,请参见以下问答: