[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6945":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},6945,"DifferenceKit","ra1028\u002FDifferenceKit","ra1028","💻 A fast and flexible O(n) difference algorithm framework for Swift collection.","https:\u002F\u002Fra1028.github.io\u002FDifferenceKit",null,"Swift",3660,242,39,19,0,1,3,59.96,"Apache License 2.0",false,"master",true,[25,26,27,28,29,30,31,32],"algorithm","changeset","collectionview","diff","difference","diffing","paul-heckel-algorithm","tableview","2026-06-12 04:00:31","\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fra1028\u002FDifferenceKit\u002Fmaster\u002Fassets\u002Fsample.gif\" height=\"310\" align=\"right\">\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fra1028\u002FDifferenceKit\u002Fmaster\u002Fassets\u002Flogo.png\" width=\"500\">\n\u003C\u002Fp>\n\n\u003CH4 align=\"center\">\nA fast and flexible O(n) difference algorithm framework for Swift collection.\u003C\u002Fbr>\nThe algorithm is optimized based on the Paul Heckel's algorithm.\n\u003C\u002FH4>\n\n\u003Cp align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fdeveloper.apple.com\u002Fswift\">\u003Cimg alt=\"Swift5\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flanguage-Swift5-orange.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Freleases\u002Flatest\">\u003Cimg alt=\"Release\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease\u002Fra1028\u002FDifferenceKit.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcocoapods.org\u002Fpods\u002FDifferenceKit\">\u003Cimg alt=\"CocoaPods\" src=\"https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fv\u002FDifferenceKit.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage\">\u003Cimg alt=\"Carthage\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCarthage-compatible-yellow.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fswift.org\u002Fpackage-manager\">\u003Cimg alt=\"Swift Package Manager\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwiftPM-compatible-yellowgreen.svg\"\u002F>\u003C\u002Fa>\n\u003C\u002Fbr>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Factions\">\u003Cimg alt=\"CI Status\" src=\"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fworkflows\u002FGitHub%20Actions\u002Fbadge.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdeveloper.apple.com\u002F\">\u003Cimg alt=\"Platform\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-green.svg\"\u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FLICENSE\">\u003Cimg alt=\"Lincense\" src=\"http:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache%202.0-black.svg\"\u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cbr>\n\n\u003Cp align=\"center\">\nMade with ❤️ by \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fra1028\">Ryo Aoyama\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fgraphs\u002Fcontributors\">Contributors\u003C\u002Fa>\n\u003Cbr clear=\"all\">\n\u003C\u002Fp>\n\n---\n\n## Features\n\n💡 Fastest **O(n)** diffing algorithm optimized for Swift collection\n\n💡 Calculate diffs for batch updates of list UI in `UIKit`, `AppKit` and [Texture](https:\u002F\u002Fgithub.com\u002FTextureGroup\u002FTexture)\n\n💡 Supports both linear and sectioned collection even if contains duplicates\n\n💡 Supports **all kind of diffs** for animated UI batch updates\n\n---\n\n## Algorithm\n\nThis is a diffing algorithm developed for [Carbon](https:\u002F\u002Fgithub.com\u002Fra1028\u002FCarbon), works stand alone.  \nThe algorithm optimized based on the Paul Heckel's algorithm.  \nSee also his paper [\"A technique for isolating differences between files\"](https:\u002F\u002Fdl.acm.org\u002Fcitation.cfm?id=359467) released in 1978.  \nIt allows all kind of diffs to be calculated in linear time **O(n)**.  \n[RxDataSources](https:\u002F\u002Fgithub.com\u002FRxSwiftCommunity\u002FRxDataSources) and [IGListKit](https:\u002F\u002Fgithub.com\u002FInstagram\u002FIGListKit) are also implemented based on his algorithm.  \n\nHowever, in `performBatchUpdates` of `UITableView`, `UICollectionView`, etc, there are combinations of diffs that cause crash when applied simultaneously.  \nTo solve this problem, `DifferenceKit` takes an approach of split the set of diffs at the minimal stages that can be perform batch updates with no crashes.\n\nImplementation is [here](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FSources\u002FAlgorithm.swift).\n\n---\n\n## Getting Started\n\n- [API Documentation](https:\u002F\u002Fra1028.github.io\u002FDifferenceKit)\n- [Example Apps](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FExamples)\n- [Benchmark](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FBenchmark)\n- [Playground](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FDifferenceKit.playground\u002FContents.swift)\n\n## Basic Usage\n\nThe type of the element that to take diffs must be conform to the `Differentiable` protocol.  \nThe `differenceIdentifier`'s type is generic associated type:\n```swift\nstruct User: Differentiable {\n    let id: Int\n    let name: String\n\n    var differenceIdentifier: Int {\n        return id\n    }\n\n    func isContentEqual(to source: User) -> Bool {\n        return name == source.name\n    }\n}\n```\n\nIn the case of definition above, `id` uniquely identifies the element and get to know the user updated by comparing equality of `name` of the elements in source and target.\n\nThere are default implementations of `Differentiable` for the types that conforming to `Equatable` or `Hashable`：\n```swift\n\u002F\u002F If `Self` conforming to `Hashable`.\nvar differenceIdentifier: Self {\n    return self\n}\n\n\u002F\u002F If `Self` conforming to `Equatable`.\nfunc isContentEqual(to source: Self) -> Bool {\n    return self == source\n}\n```\nTherefore, you can simply:\n```swift\nextension String: Differentiable {}\n```\n\nCalculate the diffs by creating `StagedChangeset` from two collections of elements conforming to `Differentiable`:\n```swift\nlet source = [\n    User(id: 0, name: \"Vincent\"),\n    User(id: 1, name: \"Jules\")\n]\nlet target = [\n    User(id: 1, name: \"Jules\"),\n    User(id: 0, name: \"Vincent\"),\n    User(id: 2, name: \"Butch\")\n]\n\nlet changeset = StagedChangeset(source: source, target: target)\n```\n\nIf you want to include multiple types conforming to `Differentiable` in the collection, use `AnyDifferentiable`:\n```swift\nlet source = [\n    AnyDifferentiable(\"A\"),\n    AnyDifferentiable(User(id: 0, name: \"Vincent\"))\n]\n```\n\nIn the case of sectioned collection, the section itself must have a unique identifier and be able to compare whether there is an update.  \nSo each section must conforming to `DifferentiableSection` protocol, but in most cases you can use `ArraySection` that general type conforming to it.  \n`ArraySection` requires a model conforming to `Differentiable` for diffing from other sections:\n```swift\nenum Model: Differentiable {\n    case a, b, c\n}\n\nlet source: [ArraySection\u003CModel, String>] = [\n    ArraySection(model: .a, elements: [\"A\", \"B\"]),\n    ArraySection(model: .b, elements: [\"C\"])\n]\nlet target: [ArraySection\u003CModel, String>] = [\n    ArraySection(model: .c, elements: [\"D\", \"E\"]),\n    ArraySection(model: .a, elements: [\"A\"]),\n    ArraySection(model: .b, elements: [\"B\", \"C\"])\n]\n\nlet changeset = StagedChangeset(source: source, target: target)\n```\n\nYou can perform diffing batch updates of `UITableView` and `UICollectionView` using the created `StagedChangeset`.  \n\n⚠️ **Don't forget** to **synchronously** update the data referenced by the data-source, with the data passed in the `setData` closure. The diffs are applied in stages, and failing to do so is bound to create a crash:\n\n```swift\ntableView.reload(using: changeset, with: .fade) { data in\n    dataSource.data = data\n}\n```\n\nBatch updates using too large amount of diffs may adversely affect to performance.  \nReturning `true` with `interrupt` closure then falls back to `reloadData`:\n```swift\ncollectionView.reload(using: changeset, interrupt: { $0.changeCount > 100 }) { data in\n    dataSource.data = data\n}\n```\n\n\u003CH3 align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fra1028.github.io\u002FDifferenceKit\">[See More Usage]\u003C\u002Fa>\n\u003C\u002FH3>\n\n---\n\n## Comparison with Other Frameworks\n\nMade a fair comparison as much as possible in performance and features with other **popular** and **awesome** frameworks.  \nThis does **NOT** determine superiority or inferiority of the frameworks.  \nI know that each framework has different benefits.  \nThe frameworks and its version that compared is below.  \n\n- [DifferenceKit](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit) - master\n- [RxDataSources](https:\u002F\u002Fgithub.com\u002FRxSwiftCommunity\u002FRxDataSources) ([Differentiator](https:\u002F\u002Fgithub.com\u002FRxSwiftCommunity\u002FRxDataSources\u002Ftree\u002Fmaster\u002FSources\u002FDifferentiator)) - 4.0.1\n- [FlexibleDiff](https:\u002F\u002Fgithub.com\u002FRACCommunity\u002FFlexibleDiff) - 0.0.8\n- [IGListKit](https:\u002F\u002Fgithub.com\u002FInstagram\u002FIGListKit) - 3.4.0\n- [DeepDiff](https:\u002F\u002Fgithub.com\u002Fonmyway133\u002FDeepDiff) - 2.2.0\n- [Differ](https:\u002F\u002Fgithub.com\u002Ftonyarnold\u002FDiffer) ([Diff.swift](https:\u002F\u002Fgithub.com\u002Fwokalski\u002FDiff.swift)) - 1.4.3\n- [Dwifft](https:\u002F\u002Fgithub.com\u002Fjflinter\u002FDwifft) - 0.9\n- [Swift.CollectionDifference](https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fswift\u002Fcollectiondifference) - Swift 5.1\n\n### Performance Comparison\n\nBenchmark project is [here](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FBenchmark).  \nPerformance was mesured by code compiled using `Xcode11.1` and `Swift 5.1` with `-O` optimization and run on `iPhone11 Pro simulator`.  \nUse `Foundation.UUID` as an element of collections.  \n\n#### - From 5,000 elements to 1,000 deleted, 1,000 inserted and 200 shuffled\n\n|                          |Time(sec)                 |\n|:-------------------------|-------------------------:|\n|DifferenceKit             |`0.0019`                  |\n|RxDataSources             |`0.0074`                  |\n|IGListKit                 |`0.0346`                  |\n|FlexibleDiff              |`0.0161`                  |\n|DeepDiff                  |`0.0373`                  |\n|Differ                    |`1.0581`                  |\n|Dwifft                    |`0.4732`                  |\n|Swift.CollectionDifference|`0.0620`                  |\n\n#### - From 100,000 elements to 10,000 deleted, 10,000 inserted and 2,000 shuffled\n\n|                          |Time(sec)                 |\n|:-------------------------|-------------------------:|\n|DifferenceKit             |`0.0348`                  |\n|RxDataSources             |`0.1024`                  |\n|IGListKit                 |`0.7002`                  |\n|FlexibleDiff              |`0.2189`                  |\n|DeepDiff                  |`0.5537`                  |\n|Differ                    |`153.8007`                |\n|Dwifft                    |`187.1341`                |\n|Swift.CollectionDifference|`5.0281`                  |\n\n### Features Comparison\n\n#### - Algorithm\n\n|                          |Base algorithm|Order|\n|:-------------------------|-------------:|----:|\n|DifferenceKit             |Heckel        |O(N) |\n|RxDataSources             |Heckel        |O(N) |\n|FlexibleDiff              |Heckel        |O(N) |\n|IGListKit                 |Heckel        |O(N) |\n|DeepDiff                  |Heckel        |O(N) |\n|Differ                    |Myers         |O(ND)|\n|Dwifft                    |Myers         |O(ND)|\n|Swift.CollectionDifference|Myers         |O(ND)|\n\n\\* [**Heckel algorithm**](https:\u002F\u002Fdl.acm.org\u002Fcitation.cfm?id=359467)  \n\\* [**Myers algorithm**](http:\u002F\u002Fwww.xmailserver.org\u002Fdiff2.pdf)  \n\n#### - Supported Collection\n\n|                          |Linear|Sectioned|Duplicate element\u002Fsection|\n|:-------------------------|:----:|:-------:|:-----------------------:|\n|DifferenceKit             |✅    |✅       |✅                      |\n|RxDataSources             |❌    |✅       |❌                      |\n|FlexibleDiff              |✅    |✅       |✅                      |\n|IGListKit                 |✅    |❌       |✅                      |\n|DeepDiff                  |✅    |❌       |✅                      |\n|Differ                    |✅    |✅       |✅                      |\n|Dwifft                    |✅    |✅       |✅                      |\n|Swift.CollectionDifference|✅    |❌       |✅                      |\n\n\\* **Linear** means 1-dimensional collection  \n\\* **Sectioned** means 2-dimensional collection  \n\n#### - Supported Element Diff\n\n|                          |Delete|Insert|Move|Reload|Move across sections|\n|:-------------------------|:----:|:----:|:--:|:----:|:------------------:|\n|DifferenceKit             |✅    |✅    |✅ |✅    |✅                  |\n|RxDataSources             |✅    |✅    |✅ |✅    |✅                  |\n|FlexibleDiff              |✅    |✅    |✅ |✅    |❌                  |\n|IGListKit                 |✅    |✅    |✅ |✅    |❌                  |\n|DeepDiff                  |✅    |✅    |✅ |✅    |❌                  |\n|Differ                    |✅    |✅    |✅ |❌    |❌                  |\n|Dwifft                    |✅    |✅    |❌ |❌    |❌                  |\n|Swift.CollectionDifference|✅    |✅    |✅ |❌    |❌                  |\n\n#### - Supported Section Diff\n\n|                          |Delete|Insert|Move|Reload|\n|:-------------------------|:----:|:----:|:--:|:----:|\n|DifferenceKit             |✅    |✅    |✅ |✅    |\n|RxDataSources             |✅    |✅    |✅ |❌    |\n|FlexibleDiff              |✅    |✅    |✅ |✅    |\n|IGListKit                 |❌    |❌    |❌ |❌    |\n|DeepDiff                  |❌    |❌    |❌ |❌    |\n|Differ                    |✅    |✅    |✅ |❌    |\n|Dwifft                    |✅    |✅    |❌ |❌    |\n|Swift.CollectionDifference|❌    |❌    |❌ |❌    |\n\n---\n\n## Requirements\n\n- Swift 4.2+\n- iOS 9.0+\n- tvOS 9.0+\n- OS X 10.9+\n- watchOS 2.0+ (only algorithm)\n\n---\n\n## Installation\n\n### [CocoaPods](https:\u002F\u002Fcocoapods.org\u002F)\n\nTo use only algorithm without extensions for UI, add the following to your `Podfile`:\n```ruby\npod 'DifferenceKit\u002FCore'\n```\n\n#### iOS \u002F tvOS\n\nTo use DifferenceKit with UIKit extension, add the following to your `Podfile`:\n```ruby\npod 'DifferenceKit'\n```\nor\n```ruby\npod 'DifferenceKit\u002FUIKitExtension'\n```\n\n#### macOS\n\nTo use DifferenceKit with AppKit extension, add the following to your `Podfile`:\n```ruby\npod 'DifferenceKit\u002FAppKitExtension'\n```\n\n#### watchOS\n\nThere is no UI extension for watchOS.  \nTo use only algorithm without extensions for UI, add the following to your `Podfile`:\n```ruby\npod 'DifferenceKit\u002FCore'\n```\n\n### [Carthage](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n\nAdd the following to your `Cartfile`:\n```ruby\ngithub \"ra1028\u002FDifferenceKit\"\n```\n\n### [Swift Package Manager for Apple platforms](https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fxcode\u002Fadding_package_dependencies_to_your_app)\n\nSelect Xcode menu `File > Swift Packages > Add Package Dependency` and enter repository URL with GUI.  \n```\nRepository: https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\n```\n\n### [Swift Package Manager](https:\u002F\u002Fswift.org\u002Fpackage-manager\u002F)\n\nAdd the following to the dependencies of your `Package.swift`:\n```swift\n.package(url: \"https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit.git\", from: \"version\")\n```\n\n---\n\n## Contribution\n\nPull requests, bug reports and feature requests are welcome 🚀  \nPlease see the [CONTRIBUTING](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FCONTRIBUTING.md) file for learn how to contribute to DifferenceKit. \n \n---\n\n## Credit\n\n#### Bibliography\nDifferenceKit was developed with reference to the following excellent materials and framework.  \n\n- [A technique for isolating differences between files](https:\u002F\u002Fdl.acm.org\u002Fcitation.cfm?id=359467) (by [Paul Heckel](https:\u002F\u002Fdl.acm.org\u002Fauthor_page.cfm?id=81100051772))\n- [DifferenceAlgorithmComparison](https:\u002F\u002Fgithub.com\u002Fhorita-yuya\u002FDifferenceAlgorithmComparison) (by [@horita-yuya](https:\u002F\u002Fgithub.com\u002Fhorita-yuya))\n\n#### OSS using DifferenceKit\nThe list of the awesome OSS which uses this library. They also help to understanding how to use DifferenceKit.  \n\n- [Carbon](https:\u002F\u002Fgithub.com\u002Fra1028\u002FCarbon) (by [@ra1028](https:\u002F\u002Fgithub.com\u002Fra1028))\n- [DiffableDataSources](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDiffableDataSources) (by [@ra1028](https:\u002F\u002Fgithub.com\u002Fra1028))\n- [Rocket.Chat.iOS](https:\u002F\u002Fgithub.com\u002FRocketChat\u002FRocket.Chat.iOS) (by [RocketChat](https:\u002F\u002Fgithub.com\u002FRocketChat))\n- [wire-ios](https:\u002F\u002Fgithub.com\u002Fwireapp\u002Fwire-ios) (by [Wire Swiss GmbH](https:\u002F\u002Fgithub.com\u002Fwireapp))\n- [ReactiveLists](https:\u002F\u002Fgithub.com\u002Fplangrid\u002FReactiveLists) (by [PlanGrid](https:\u002F\u002Fgithub.com\u002Fplangrid))\n- [ReduxMovieDB](https:\u002F\u002Fgithub.com\u002Fcardoso\u002FReduxMovieDB) (by [@cardoso](https:\u002F\u002Fgithub.com\u002Fcardoso))\n- [TetrisDiffingCompetition](https:\u002F\u002Fgithub.com\u002Fskagedal\u002FTetrisDiffingCompetition) (by [@skagedal](https:\u002F\u002Fgithub.com\u002Fskagedal))\n\n#### Other diffing libraries\nI respect and ️❤️ all libraries involved in diffing.  \n\n- [RxDataSources](https:\u002F\u002Fgithub.com\u002FRxSwiftCommunity\u002FRxDataSources) (by [@kzaher](https:\u002F\u002Fgithub.com\u002Fkzaher), [RxSwift Community](https:\u002F\u002Fgithub.com\u002FRxSwiftCommunity))\n- [IGListKit](https:\u002F\u002Fgithub.com\u002FInstagram\u002FIGListKit) (by [Instagram](https:\u002F\u002Fgithub.com\u002FInstagram))\n- [FlexibleDiff](https:\u002F\u002Fgithub.com\u002FRACCommunity\u002FFlexibleDiff) (by [@andersio](https:\u002F\u002Fgithub.com\u002Fandersio), [RACCommunity](https:\u002F\u002Fgithub.com\u002FRACCommunity))\n- [DeepDiff](https:\u002F\u002Fgithub.com\u002Fonmyway133\u002FDeepDiff) (by [@onmyway133](https:\u002F\u002Fgithub.com\u002Fonmyway133))\n- [Differ](https:\u002F\u002Fgithub.com\u002Ftonyarnold\u002FDiffer) (by [@tonyarnold](https:\u002F\u002Fgithub.com\u002Ftonyarnold))\n- [Dwifft](https:\u002F\u002Fgithub.com\u002Fjflinter\u002FDwifft) (by [@jflinter](https:\u002F\u002Fgithub.com\u002Fjflinter))\n- [Changeset](https:\u002F\u002Fgithub.com\u002Fosteslag\u002FChangeset) (by [@osteslag](https:\u002F\u002Fgithub.com\u002Fosteslag))\n\n---\n\n## License\nDifferenceKit is released under the [Apache 2.0 License](https:\u002F\u002Fgithub.com\u002Fra1028\u002FDifferenceKit\u002Fblob\u002Fmaster\u002FLICENSE).\n","DifferenceKit 是一个用于 Swift 集合的快速且灵活的 O(n) 差异算法框架。它基于 Paul Heckel 算法进行了优化，能够高效地计算列表 UI 的差异并支持批量更新，适用于 `UIKit`、`AppKit` 以及 Texture 框架。该工具不仅支持线性和分段集合（即使包含重复项），还提供了多种类型的差异计算以实现动画化的 UI 批量更新。DifferenceKit 适用于需要高性能列表数据展示与更新的应用场景，如 iOS、macOS、tvOS 和 watchOS 平台上对性能敏感的用户界面开发。",2,"2026-06-11 03:09:40","top_language"]