Changeset - Proyek kecil yang cukup mengagumkan
- Joel Levin
Ini adalah upaya untuk mengimplementasikan solusi yang diuraikan dalam artikel Dave DeLong, edit jarak dan edit langkah.
A Changeset menjelaskan pengeditan minimal yang diperlukan untuk beralih dari satu Collection elemen Equatable ke yang lain.
Telah ditulis terutama untuk digunakan bersama dengan sumber data UITableView dan UICollectionView dengan mendeteksi penambahan, penghapusan, substitusi, dan gerakan antara dua set data. Tetapi juga dapat digunakan untuk menghitung perubahan yang lebih umum antara dua set data.
Kode berikut menghitung suntingan minimal dari contoh kanonik, beralih dari koleksi String "kucing" menjadi "duduk":
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 6Pernyataan berikut kemudian akan berhasil:
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 ) Jika Anda tidak ingin overhead Changeset itu sendiri, yang juga menyimpan koleksi sumber dan target, Anda dapat menghubungi edits secara langsung (di sini dengan contoh data dari panduan pemrograman tampilan tabel Apple untuk iOS):
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]Perhatikan bahwa ChangeTet menggunakan offset, bukan indeks, untuk merujuk ke elemen dalam koleksi. Ini terutama karena koleksi Swift tidak dijamin menggunakan indeks integer berbasis nol. Lihat diskusi dalam edisi #37 untuk lebih jelasnya.
Nilai offset dapat digunakan secara langsung di blok animasi beginUpdates / endUpdates di UITableView dan performBatchUpdates pada UICollectionView di mana Changeset mengikuti prinsip -prinsip yang dijelaskan di bawah penyisipan batch, penghapusan, dan memuat ulang baris dan bagian dalam panduan Apple.
Pendeknya; Pertama semua penghapusan dan penggantian dibuat, relatif terhadap koleksi sumber, kemudian, relatif terhadap koleksi yang dihasilkan, penyisipan. Sebuah gerakan hanyalah penghapusan diikuti oleh penyisipan.
Dalam kerangka kerja iOS, dua ekstensi kenyamanan (satu di UITableView dan satu di UICollectionView ) telah disertakan untuk membuat pembaruan tabel/koleksi animasi. Panggil saja update , seperti ini:
tableView . update ( with : changeset . edits ) Secara default A Changeset menggunakan == untuk membandingkan elemen, tetapi Anda dapat menulis pembanding Anda sendiri, diilustrasikan di bawah ini, di mana kejadian "A" selalu memicu perubahan:
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 )Akibatnya, perubahan akan terdiri dari substitusi "A" (ke "A" lainnya):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits ) Salah satu kemungkinan penggunaan ini adalah ketika sel dalam UITableView atau UICollectionView tidak boleh beragam saat berubah.
Proyek XCode juga berisi target untuk menggambarkan penggunaan dalam aplikasi:

Ini menggunakan ekstensi yang disebutkan di atas untuk menghidupkan transisi berdasarkan pengeditan Changeset .
Proyek ini tersedia di bawah lisensi MIT.
Hak Cipta © 2015-18, Joachim Bondo. Lihat file lisensi.