クラスのジェネリクスの特殊化の冗長な書き方をなくしたい
class Hoge<T: Equatable>: Equatable {
let e: T
init(e: T) {
self.e = e
}
static func == (lhs: Hoge<T>, rhs: Hoge<T>) -> Bool {
return lhs.e == rhs.e
}
}
class HogeA: Hoge<Int> {}
class HogeB: Hoge<String> {}
class Foo<T: Equatable, U: Hoge<T>>: Equatable {
var ee: U
init(ee: U) {
self.ee = ee
}
static func == (lhs: Foo<T, U>, rhs: Foo<T, U>) -> Bool {
return lhs.ee == rhs.ee
}
}
class FooA: Foo<Int, HogeA> {}
class FooB: Foo<String, HogeB> {}
let fooA1 = FooA(ee: HogeA(e: 1))
let fooA2 = FooA(ee: HogeA(e: 2))
let fooB1 = FooB(ee: HogeB(e: "あ"))
let fooB2 = FooB(ee: HogeB(e: "あ"))
print(fooA1 == fooA2)
print(fooB1 == fooB2)
上記のコードにおいて
class Foo<T: Equatable, U: Hoge<T>>: Equatable {
...
}
class FooA: Foo<Int, HogeA> {}
class FooB: Foo<String, HogeB> {}
の部分が、特殊化の引数を2つ取って冗長です。
本当は
class Foo<U: Hoge<T: Equatable>>: Equatable { // 文法エラー
...
}
class FooA: Foo<HogeA> {}
class FooB: Foo<HogeB> {}
としたいのですが、Fooの定義をうまく書けません(文法エラー)。
なにかうまい書き方はSwiftに用意されていますか?