Cow 1.0.0

Cow 1.0.0

测试已测试
语言语言 SwiftSwift
许可证 BSD
发布上次发布2015 年 2 月
SPM支持 SPM

Vincent Esche 维护。



Cow 1.0.0

  • Vincent Esche

Cow

Cow

Cow 致力于为您提供一种简单易集成的针对自己的 Swift 数据结构的拷贝-on-write 层。

Cow 适用于同时运行的 iOS (8.0 或更高版本) 和 OS X (10.9 或更高版本)。

安装

只需将 "Cow/Classes/..." 中的文件复制到您的项目中。

或者,您可以使用CocoaPods将 Cow 安装到您的项目中。
只需将其添加到您的 Podfile: pod 'Cow'

用法

(有关 CowTests.swiftCow<…> 的示例用法,请参见)

将 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 文件。