Cow 致力于为您提供一种简单易集成的针对自己的 Swift 数据结构的拷贝-on-write 层。
Cow 适用于同时运行的 iOS (8.0 或更高版本) 和 OS X (10.9 或更高版本)。
只需将 "Cow/Classes/..."
中的文件复制到您的项目中。
或者,您可以使用CocoaPods将 Cow 安装到您的项目中。
只需将其添加到您的 Podfile: pod 'Cow'
(有关 CowTests.swift
中 Cow<…>
的示例用法,请参见)
将 CoW 包装您的内部昂贵的对象作为成员添加到您的类中
class Container {
typealias CoW = Cow<SomeExpensiveInternalObject>
private(set) var cow: CoW
// ...
}
以这种方式初始化您的类
init() {
let initialValue = Value()
self.cow = CoW(initialValue) {
Value($0) // used for copying on write
}
// ...
}
提供这样的复制初始化器
init(_ other: Container) {
self.cow = CoW.attachTo(other.cow)
// ...
}
添加这样的析构器
deinit {
self.cow.detach()
}
最后但同样重要的是,请像这样包装所有修改逻辑
mutate(&self.cow) { value in
// mutate or even re-assign `value` (it's an inout parameter)
return
}
非修改逻辑 可以简单地 转发到 self.cow.value
。
Cow<…>
的实例会跟踪与之关联的所有者的数量,并在适当的时候分离其副本。
修改函数检查提供的 cow
是否在多个“所有者”之间共享,并创建一个包含 cow
及其 value
的副本,并用它覆盖提供的 cow
,然后将它传递给闭包以执行实际的修改逻辑。
如果 Swift struct
提供了一种将其运行时定义的复制和析构例程与 struct
的复制相关联的方法(不幸的是并非如此),则可以使用 Cow 将复杂的类数据结构(如列表、树、图等)包装在轻量级的 struct
中,将它们转换为具有 最佳复制性能 (O(1)
) 和 最小内存消耗 的 值类型。但它没有。
因此,Cow 主要仍然是一个概念验证和有趣的编码练习。
Cow 包含 单元测试。
无
Vincent Esche (@regexident)
Cow 在一个修改后的 BSD-3 条款许可下可用,具有除归属要求以外的附加要求。有关更多信息,请参阅 LICENSE
文件。