Header Ads(他スクリプト)

(技術メモ)Swiftでクラスメソッドを定義する際の注意

当たり前のことなのだが、クラスメソッドの中で、同じクラスのメソッドを呼び出す場合も、そのクラスのインスタンスがないのであれば、呼び出される側のメソッドもクラスメソッドでなければいけない。

例)
class A {
    class func B(b: String) {
        C(b)                       ←エラー
    }
    func C(c: String) {    ←ここもclassメソッドにすれば解消される
    }
}

ただ、この時のSwiftのエラーが分かり難かったので、この凡ミスに気づくのに少し手間取ったのでメモ。

-----------------------------------------------------
上記の例)をコンパイルした時のエラーメッセージはこんな感じになる。

  「Cannot convert value of type 'String?' to expected argument type 'A'」
   →「Stringクラスを、引数のクラスAに変換できません。」


このエラーメッセージを見ただけだと「いやいや、メソッドCの引数はStringで定義しているんですがあああ」ってなってしまう。

------------------------------------------------------
どうやらSwiftでは、インスタンスメソッドをクラスメソッドのように呼び出しすると、引数にインスタンスを求めてくるようで、そこから上記のエラーメッセージが導き出されているようだ。

C(self: A) ←こんなイメージのメソッドが内部的に勝手に定義され、それに当てはめようとしてエラーになっていた。わかんねー。

------------------------------------------------------
結局、私はエラーメッセージに頼らず、コードを眺めて解決するに至ったので、同じとこに引っかかった方の手助けになればいいな。

0 件のコメント

Powered by Blogger.