【swift】RxDataSourcesでEquatableに準拠せさるときに!
はじめに
RxSwift
で、TableViewの差分更新を行うときに、RxDataSources
を使うことがあると思います。
RxDataSorces
の詳細に関しては、公式レポジトリーを参照してださい....
RxDataSources
RxTableViewSectionedAnimatedDataSource
を使う場合、AnimatableSectionModelType
に準拠したmodelを用意する必要があります。
実装としては
1. RxTableViewSectionedAnimatedDataSource
でcell
やsection
などのtableView
の設定をAnimatableSectionModelType
に準拠したmodelを用いて行う
2. AnimatableSectionModelType
に準拠したObservable
なmodel
をtableView
にbind
する
詳細はサンプルコードをみてください。(RxDataSources/Example/Example1_CustomizationUsingTableViewDelegate.swift)
Equatableへの準拠
上記の実装のように、RxDataSources
を使うにはAnimatableSectionModelType
に準拠したmodelを用意する必要があり、準拠するAnimatableSectionModelType
のprotocolは下記のようになっています。
public protocol AnimatableSectionModelType {
: SectionModelType
, IdentifiableType where Item: IdentifiableType, Item: Equatable {
}
また、AnimatableSectionModelType
が準拠しているSectionModelType
は下記の実装になっています。
public protocol SectionModelType {
associatedtype Item
var items: [Item] { get }
init(original: Self, items: [Item])
}
SectionModelType
のGenericsのItem
はIdentifiableType
とEquatable
に準拠する必要があります!!
困ったこと:Equatable
に準拠できない!?
NSObject
に準拠したmodelをEquatable
に準拠させようとしていた。。。
class TestModel: NSObject {
let id: Int
}
extension TestModel: Equatable {
static func == (lhs: TestModel, rhs: TestModel) -> Bool {
return lhs.id == rhs.id
}
}
下記のコンパイルエラーがでる
Redundant conformance of 'TestModel' to protocol 'Equatable'
自作したクラスTestModel
をEquatable
に準拠したつもりはないのに、なぜ準拠済みなのかわからない??
理由:NSObjectがすでにEquatableである!
NSObjectのドキュメントのConformsにあるように、NSObject
はすでにEquatable
に準拠しています。そのため、上記の実装だと既に準拠だとエラーが出ます。
ちなみに、NSObject
のEquatable
は参照しているポインタが同じかどうかをチェックしています。
superクラスの比較でなく、subclassを用いて比較させたい場合は、subclassにクラスメソッドを実装することで、subclassでの比較を行うことができます。
extension TestModel {
static func ==(lhs: TestModel, rhs: TestModel) -> Bool {
return lhs.id == rhs.id
}
}
swift4.1からのEquatable
ここからは上記のエラーとは異なりますが、Equatable
なクラスを実装するときの追加の話です。
swift4.1からは、より簡単にEquatable
の実装を行うことができます。
swift4.1で実装されたSynthesizing Equatable and Hashable conformanceによって、コンパイラーが自動的にEquatable
とHashable
に準拠させてくれます。
条件としては、
Equatable
の実装するクラス
or enum
or struct
で定義されているstored instance property
とassociated value
が、Equatable
に準拠している場合に、static func == (lhs: Self, rhs: Self) -> Bool
が暗黙的に実装されます。
実装例が下記になります!
swift4.0の場合
struct Person: Equatable {
let firstName: String
let lastName: String
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.firstName == rhs.firstName &&
lhs.lastName == rhs.lastName &&
}
}
swift4.1の場合(暗黙的にEquatable
に準拠できる!!)
struct Person: Equatable {
let firstName: String
let lastName: String
}
上記のようにEquatable
に準拠する際に、大量のコードを記述する必要がなくなって、よりEquatable
が使いやすくなり、RxDataSources
も使いやすくなったと思います!!!
Author And Source
この問題について(【swift】RxDataSourcesでEquatableに準拠せさるときに!), 我々は、より多くの情報をここで見つけました https://qiita.com/akihisasen/items/42145d60e6fc7e5fb5b1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .