在 Swift 5.1 中实现惰性初始化的几种方法。请注意,如果您对 Swift 的 lazy
关键字的行为感到满意,则应该使用它。这里是为那些需要非常特定行为的人准备的。
Lazy
:一种不可重置的惰性模式,保证跨 Swift 语言版本的惰性行为。ResettableLazy
:一种可重置的惰性模式,其值仅在首次需要时生成和缓存,并在不再需要时销毁。FunctionalLazy
:一种关于如何使用函数而不是分支来处理惰性模式的想法。内置容器 (Lazy
、ResettableLazy
和 FunctionalLazy
) 在其值也符合时,会自动符合 Equatable
、Hashable
、Encodable
和 Decodable
!这是一种传递一致性,仅调用包装值的函数。
但请记住,为了做到这一点,该值会自动初始化和访问!
为了与 Swift Package Manager 兼容,必须更改整个存储库结构 (#4)。因此,API 版本从 2.0.0 更改为 3.0.0。实际 API 的更改很少 (#8);几乎完全是为了服务 Swift Package Manager。
在 2.0.0 版本中,此自述文件建议您将对 ./Lazy.swift
的任何引用更改为 ./LazyContainers/Sources/LazyContainers/LazyContainers.swift
。不幸的是,这与 Swift Package Manager 不兼容,因此 ./Lazy.swift
已更改为 ./Sources/LazyContainers/LazyContainers.swift
。因此,请将对 ./LazyContainers/Sources/LazyContainers/LazyContainers.swift
的任何引用更改为 ./Sources/LazyContainers/LazyContainers.swift
。对此感到抱歉 🤷🏽
很容易使用这些中的每一个。只需将相应的那个作为属性包装器放置在你想要的位置即可。
它的简单用法非常直接
@Lazy
var myLazyString = "Hello, lazy!"
print(myLazyString) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
myLazyString = "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
这将打印
Hello, lazy!
Hello, lazy!
Overwritten
Overwritten
如果你有复杂的初始化逻辑,你可以把它传递给属性包装器
func makeLazyString() -> String {
print("Initializer side-effect")
return "Hello, lazy!"
}
@Lazy(initializer: makeLazyString)
var myLazyString: String
print(myLazyString) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
myLazyString = "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
你也可以直接使用它 (而不是作为属性包装器)
var myLazyString = Lazy<String>() {
print("Initializer side-effect")
return "Hello, lazy!"
}
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString.wrappedValue) // Just returns the value "Hello, lazy!"
myLazyString.wrappedValue = "Overwritten"
print(myLazyString.wrappedValue) // Just returns the value "Overwritten"
print(myLazyString.wrappedValue) // Just returns the value "Overwritten"
这些都将打印
Initializer side-effect
Hello, lazy!
Hello, lazy!
Overwritten
Overwritten
它的简单用法非常直接
@ResettableLazy
var myLazyString = "Hello, lazy!"
print(myLazyString) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
_myLazyString.clear()
print(myLazyString) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
myLazyString = "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
_myLazyString.clear()
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
这将打印
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) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
_myLazyString.clear()
print(myLazyString) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString) // Just returns the value "Hello, lazy!"
myLazyString = "Overwritten"
print(myLazyString) // Just returns the value "Overwritten"
_myLazyString.clear()
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
你也可以直接使用它 (而不是作为属性包装器)
var myLazyString = ResettableLazy<String>() {
print("Initializer side-effect")
return "Hello, lazy!"
}
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString.wrappedValue) // Just returns the value "Hello, lazy!"
myLazyString.clear()
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
print(myLazyString.wrappedValue) // Just returns the value "Hello, lazy!"
myLazyString.wrappedValue = "Overwritten"
print(myLazyString.wrappedValue) // Just returns the value "Overwritten"
_myLazyString.clear()
print(myLazyString.wrappedValue) // Initializes, caches, and returns the value "Hello, lazy!"
这些都将打印
Initializer side-effect
Hello, lazy!
Hello, lazy!
Initializer side-effect
Hello, lazy!
Hello, lazy!
Overwritten
Initializer side-effect
Hello, lazy!
这在功能上 (哈哈!) 与 Lazy
相同。 唯一的区别是,我认为用函数而不是枚举来实现它会很有趣。 🤓