ListDiff
ListDiff 是 IGListKit 的 IGListKit 的 IGListDiff 的 Swift 版本。它是 Paul Heckel 的一个算法的实现,该算法用于计算两个数组之间的差异。
动机
这个项目的动机来自于以下 挑战,我从 Ryan Nystrom 在 iOSConf.SG 的讲话中了解到。
入门
swift package generate-xcodeproj
安装
CocoaPods
pod 'ListDiff'
Carthage
github "lxcid/ListDiff" "master"
使用说明
import ListDiff
extension Int : Diffable {
public var diffIdentifier: AnyHashable {
return self
}
}
let o = [0, 1, 2]
let n = [2, 1, 3]
let result = List.diffing(oldArray: o, newArray: n)
// result.hasChanges == true
// result.deletes == IndexSet(integer: 0)
// result.inserts == IndexSet(integer: 2)
// result.moves == [List.MoveIndex(from: 2, to: 0), List.MoveIndex(from: 1, to: 1)]
// result.changeCount == 4
理由
在移植过程中,我作出了几个决定,在这里我会进行理性分析。
- 使用不区分大小写的枚举作为命名空间。参见Erika Sadun的文章。
- 不支持索引路径。决定这超出了范围。
- 栈与堆。据我所知,Swift并不提倡考虑栈与堆分配模型,把优化决策留给编译器。尽管如此,某些准则更倾向于使用
struct
,因此只有List.Entry
是一个(最终的)类,因为我们需要对其实例的引用。