(技術メモ)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) ←こんなイメージのメソッドが内部的に勝手に定義され、それに当てはめようとしてエラーになっていた。わかんねー。
------------------------------------------------------
結局、私はエラーメッセージに頼らず、コードを眺めて解決するに至ったので、同じとこに引っかかった方の手助けになればいいな。
例)
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) ←こんなイメージのメソッドが内部的に勝手に定義され、それに当てはめようとしてエラーになっていた。わかんねー。
------------------------------------------------------
結局、私はエラーメッセージに頼らず、コードを眺めて解決するに至ったので、同じとこに引っかかった方の手助けになればいいな。
Post a Comment