IGListKit "isEqual" всегда возвращает "true", даже если массив элементов обновлен или заменен
Я использую IGListKit. Я создал простое приложение с этим. Это приложение показывает список элементов, который называется каналами в моем коде.
Ниже мой код. Когда метод update вызывает пользовательское действие, новые каналы генерируются со значением randam и добавляются в массив каналов. Когда вызывается метод replace, массив каналов полностью заменяется новыми сгенерированными элементами канала.
class ViewController: UIViewController, ListAdapterDataSource {
lazy var adapter: ListAdapter = {
return ListAdapter(updater: ListAdapterUpdater(), viewController: self)
}()
@IBOutlet weak var collectionView: UICollectionView!
var channels: [Channel] = []
private var generateCount = 0
override func viewDidLoad() {
super.viewDidLoad()
self.adapter.collectionView = self.collectionView
self.adapter.dataSource = self
}
func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
return self.channels as! [ListDiffable]
}
func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
return ChannelSectionController()
}
func emptyView(for listAdapter: ListAdapter) -> UIView? {
return nil
}
@IBAction func update(_ sender: UIButton) {
let newChannels = self.generateNewChannel()
// Append
self.channels += newChannels
self.adapter.performUpdates(animated: true, completion: nil)
}
@IBAction func replace(_ sender: UIButton) {
let newChannels = self.generateNewChannel()
// Replace
self.channels = newChannels
self.adapter.reloadData(completion: nil)
}
func generateNewChannel() -> [Channel] {
// Generate new Channel List.
var newChannels = [Channel]()
for i in 0 ..< 3 {
let color = UIColor(red: CGFloat(arc4random_uniform(255))/255.0,
green: CGFloat(arc4random_uniform(255))/255.0,
blue: CGFloat(arc4random_uniform(255))/255.0,
alpha: 1.0)
newChannels.append(Channel(id: "\(self.generateCount * 3 + i)", color: color))
}
self.generateCount += 1
return newChannels
}
}
class Channel {
let color: UIColor
let id: String
init(id: String, color: UIColor) {
self.id = id
self.color = color
}
}
extension Channel: ListDiffable {
func diffIdentifier() -> NSObjectProtocol {
return id as NSObjectProtocol
}
func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
var isEqual = false
if let channel = object as? Channel {
isEqual = (id == channel.id)
}
print("isEqual: \(isEqual)") // <- This becomes always "true".
return isEqual
}
}
Это приложение работает нормально. Отображаемые каналы обновляются правильно.
Однако метод "isEqual" в классе Channel всегда возвращает "true", даже если элементы массива канала, которые используются в objects
Метод обновлен или заменен. Это правильное поведение? Насколько я понимаю, это должно быть "ложным", когда элементы массива канала изменены.