更改 - 很棒的小項目
- 喬爾·萊文(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。請參閱許可證文件。