Tested on GitHub Actions

swift package manager 5.2 is supported Supports macOS, iOS, tvOS, watchOS, Linux, & Windows

Swift 惰性容器

在 Swift 5.1 中实现惰性初始化的几种方法。请注意,如果您对 Swift 的 lazy 关键字的行为感到满意,则应该使用它。这里是为那些需要非常特定行为的人准备的。

自动一致性

内置容器 (LazyResettableLazyFunctionalLazy) 在其值也符合时,会自动符合 EquatableHashableEncodableDecodable!这是一种传递一致性,仅调用包装值的函数。

但请记住,为了做到这一点,该值会自动初始化和访问!

兼容性通知

为了与 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

它的简单用法非常直接

@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

它的简单用法非常直接

@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!

FunctionalLazy

这在功能上 (哈哈!)Lazy 相同。 唯一的区别是,我认为用函数而不是枚举来实现它会很有趣。 🤓