因为在Swift 4中行为发生了lazy
变化,所以我写了一些struct
s给出了非常具体的行为,这些行为永远不会在语言版本之间发生变化。我将它们放在BH-1-PD许可下的GitHub上:https : //github.com/RougeWare/Swift-Lazy-Patterns
这是与此问题相关的一个问题,它为您提供了一种方法来对值进行延迟初始化,缓存该值并销毁它,以便以后可以对它进行延迟重新初始化。
请注意,这需要Swift 5.1!对于Swift 4版本,请参阅该repo的1.1.1版本。
它的简单用法非常简单:
@ResettableLazy
var myLazyString = "Hello, lazy!"
print(myLazyString)
print(myLazyString)
_myLazyString.clear()
print(myLazyString)
print(myLazyString)
myLazyString = "Overwritten"
print(myLazyString)
_myLazyString.clear()
print(myLazyString.wrappedValue)
这将打印:
Hello, lazy!
Hello, lazy!
Hello, lazy!
Hello, lazy!
Overwritten
Hello, lazy!
如果您具有复杂的初始化器逻辑,则可以将其传递给属性包装器:
func makeLazyString() -> String {
print("Initializer side-effect")
return "Hello, lazy!"
}
@ResettableLazy(initializer: makeLazyString)
var myLazyString: String
print(myLazyString)
print(myLazyString)
_myLazyString.clear()
print(myLazyString)
print(myLazyString)
myLazyString = "Overwritten"
print(myLazyString)
_myLazyString.clear()
print(myLazyString.wrappedValue)
您也可以直接使用它(作为属性包装器使用):
var myLazyString = ResettableLazy<String>() {
print("Initializer side-effect")
return "Hello, lazy!"
}
print(myLazyString.wrappedValue)
print(myLazyString.wrappedValue)
myLazyString.clear()
print(myLazyString.wrappedValue)
print(myLazyString.wrappedValue)
myLazyString.wrappedValue = "Overwritten"
print(myLazyString.wrappedValue)
_myLazyString.clear()
print(myLazyString.wrappedValue)
这些都将打印:
Initializer side-effect
Hello, lazy!
Hello, lazy!
Initializer side-effect
Hello, lazy!
Hello, lazy!
Overwritten
Initializer side-effect
Hello, lazy!
这个答案已经更新;其原始解决方案不再适用于Swift 4及更高版本。
相反,我建议您使用上面列出的解决方案之一或@PBosman的解决方案
以前,此答案取决于错误行为。无论是老版本的答案,它的行为,为什么这是一个错误的文本和注释中描述斯威夫特错误SR-5172(其中已解决作为2017年7月14日与PR#10911),和很明显这种行为绝不是故意的。
该解决方案是在Swift错误的文本中以及在此答案的历史中,但是由于它是一个漏洞利用程序,因此在Swift 3.2+中不起作用,我建议您不要这样做。
Clinet
和ClinetSession
故意或者是一个错字?