更改 - 很棒的小项目
- 乔尔·莱文(Joel Levin)
这是一种尝试实现Dave DeLong文章中概述的解决方案,编辑距离和编辑步骤。
一个Changeset描述了从一个Equatable元素到另一个元素的Collection所需的最小编辑。
它主要是通过检测两组数据组之间的添加,删除,替换和移动来结合使用UITableView和UICollectionView数据源使用的。但是它也可以用于计算两个数据集之间的更一般的更改。
以下代码计算规范示例的最小编辑,从String集合“小猫”到“坐着”:
let changeset = Changeset ( source : " kitten " , target : " sitting " )
print ( changeset )
// 'kitten' -> 'sitting':
// replace with s at offset 0
// replace with i at offset 4
// insert g at offset 6然后,以下主张将成功:
let edits = [
Changeset < String > . Edit ( operation : . substitution , value : " s " , destination : 0 ) ,
Changeset < String > . Edit ( operation : . substitution , value : " i " , destination : 4 ) ,
Changeset < String > . Edit ( operation : . insertion , value : " g " , destination : 6 ) ,
]
assert ( changeset . edits == edits )如果您不希望Changeset本身的开销(也存储源和目标集合),则可以直接调用edits (在此处包含来自iOS的Apple Table View编程指南的示例数据):
let source = [ " Arizona " , " California " , " Delaware " , " New Jersey " , " Washington " ]
let target = [ " Alaska " , " Arizona " , " California " , " Georgia " , " New Jersey " , " Virginia " ]
let edits = Changeset . edits ( from : source , to : target )
print ( edits )
// [insert Alaska at offset 0, replace with Georgia at offset 2, replace with Virginia at offset 4]请注意,更改图使用偏移而不是指数来指代集合中的元素。这主要是因为不能保证Swift收集使用零基整数索引。有关更多详细信息,请参见第37期中的讨论。
偏移值可以直接在UITableView上的beginUpdates / endUpdates的动画块中使用,并在UICollectionView上的performBatchUpdates中使用,该Changeset遵循批处理插入,删除和重新装载和在Apple指南中的行和段的重新加载下所解释的原则。
简而言之;首先,相对于源收集的源收集,所有删除和替换都是进行插入的。举动只是删除,然后是插入。
在iOS框架中,包括两个便利性扩展(一个在UITableView上,另一个在UICollectionView上),以使动画表/收集视图更新变得轻而易举。只需致电update ,这样:
tableView . update ( with : changeset . edits ) 默认情况下, Changeset图==比较元素,但是您可以编写自己的比较器,如下所示,其中“ a”的出现总是触发变化:
let alwaysChangeA : ( Character , Character ) -> Bool = {
if $0 == " a " || $1 == " a " {
return false
} else {
return $0 == $1
}
}
let changeset = Changeset ( source : " ab " , target : " ab " , comparator : alwaysChangeA )结果,更改将包括替换“ a”(另一个“ a”):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits )一种可能的用途是,当UITableView或UICollectionView中的单元格在更改时不应动画时。
Xcode项目还包含一个目标,可以说明应用程序中的用法:

这使用上面提到的扩展程序来基于Changeset的编辑进行动画转换。
该项目可根据麻省理工学院许可获得。
版权所有©2015-18,Joachim Bondo。请参阅许可证文件。