ことの発端
条件付き適合を使用して処理を分けつつ共通化していたとき
なぜか条件付き適合ではない方の処理を実行していました。
環境
swift 5
Xcode 11.3
ソースコード
protocol Hoge {
associatedtype Value
func value(_ value: Value?) -> Value?
}
struct HogeImple<Value> {
// jQuery風に value が届いたら保存、なければ読込
func value(_ value: Value? = nil) -> Value? {
if let value = value {
self.store(value)
return value
}
return self.read(value)
}
}
private extension Hoge {
func store(_ value: Value?) {
// 保存
/* !!! String, Codable もこちらにくる!? !!! */
}
func read() -> Value? {
// 読込
}
}
private extension Hoge where Value == String {
func read(_ value: Value?) {
// 文字列の読込
}
}
private extension Hoge where Value: Codable {
func store(_ value: Value?) {
// Codableの保存
}
func read() -> Value? {
// Codableの読込
}
}
実験
条件付き適合が動作する条件は何か実験してみました。
protocol Hoge {
associatedtype Value
}
struct HogeImple<Value>: Hoge {
func execute(_ value: Value) {
self.hoge(value)
}
}
extension Hoge {
func hoge(_ value: Value) {
print("Hoge", value)
}
}
extension Hoge where Value == String {
func hoge(_ value: Value) {
print("String", value)
}
}
extension Hoge where Value: Numeric {
func hoge(_ value: Value) {
print("Numeric", value)
}
}
let boolHoge = HogeImple<Bool>()
boolHoge.execute(true)
boolHoge.hoge(true)
let strHoge = HogeImple<String>()
strHoge.execute("Value")
strHoge.hoge("Value")
let intHoge = HogeImple<Int>()
intHoge.execute(3)
intHoge.hoge(3)
結果
Bool型 : 適合条件なし
String型 : where Value == String
に適合
Int型 : where Value: Numeric
に適合
execute
struct HogeImple
内の関数
hoge
extention Hoge
内の関数
型 | 関数 | 結果 |
---|---|---|
Bool | execute | Hoge true |
Bool | hoge | Hoge true |
String | execute | Hoge Value |
String | hoge | String Value |
Int | execute | Hoge 3 |
Int | hoge | Numeric 3 |
まとめ
- 具象型からは extension の適合条件で分岐することができない
これはバグだと思うんですが、どうなんでしょうか?