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

看来,使用惰性变量实现协议所需的变量是不可能的.例如:
protocol Foo {
  var foo: String { get }
}

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

编译器抱怨Type’Bar’不符合协议’Foo’.

也不可能在协议声明中添加lazy关键字,因为在协议要求错误上不允许“懒惰”.

这根本不可能吗?

引用 the Language Guide – Properties – Lazy Stored Properties [强调我的]:

A lazy stored property is a property whose initial value is not
calculated until the first time it is used
.

即,该值在首次使用时发生变异.由于foo已经在Foo协议中被蓝图打印为get,隐式非变换get,因此值类型Bar不会使用其惰性属性foo(具有变异getter的属性)来实现此承诺.

将Bar更改为引用类型将允许它实现Foo蓝图(因为改变引用类型的属性不会改变类型实例本身):

protocol Foo {
    var foo: String { get }
}

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

另外,在Foo的foo属性的蓝图中指定它有一个变异的getter.

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

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

有关getter和setter的mutating / nonmutating说明符的一些其他详细信息,请参阅以下Q& A:

> Swift mutable set in property

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...