0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

extensionの条件付き適合の謎

Posted at

ことの発端

条件付き適合を使用して処理を分けつつ共通化していたとき
なぜか条件付き適合ではない方の処理を実行していました。

環境

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 の適合条件で分岐することができない

これはバグだと思うんですが、どうなんでしょうか?

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?