ชุดเปลี่ยน - โครงการเล็ก ๆ น้อย ๆ ที่ยอดเยี่ยม
- โจเอลเลวิน
นี่เป็นความพยายามในการใช้โซลูชันที่ระบุไว้ในบทความของ Dave Delong, แก้ไขระยะทางและขั้นตอนการแก้ไข
Changeset อธิบายการแก้ไขขั้นต่ำที่จำเป็นในการเปลี่ยนจากคอล Collection หนึ่งขององค์ประกอบ Equatable ยังอีกคอลเลกชัน
มันถูกเขียนขึ้นเป็นหลักเพื่อใช้ร่วมกับแหล่งข้อมูล 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 ได้โดยตรง (ที่นี่พร้อมข้อมูลตัวอย่างจากคู่มือการเขียนโปรแกรมมุมมองตารางของ Apple สำหรับ 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]โปรดทราบว่าการเปลี่ยนแปลงใช้งานออฟเซ็ตไม่ใช่ดัชนีเพื่ออ้างถึงองค์ประกอบในคอลเลกชัน นี่เป็นส่วนใหญ่เป็นเพราะคอลเลกชัน Swift ไม่รับประกันว่าจะใช้ดัชนีจำนวนเต็มที่ใช้เป็นศูนย์ ดูการสนทนาในฉบับที่ 37 สำหรับรายละเอียดเพิ่มเติม
ค่าออฟเซ็ตสามารถใช้โดยตรงในบล็อกภาพเคลื่อนไหวของ beginUpdates / endUpdates บน UITableView และ performBatchUpdates บน UICollectionView ใน 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
โครงการนี้มีอยู่ภายใต้ใบอนุญาต MIT
ลิขสิทธิ์© 2015-18, Joachim Bondo ดูไฟล์ใบอนุญาต