2017-03-20 6 views
0

enter image description here同じ引数型のSwift初期化子

これはどういう仕組みかわかりません。ご覧のように、同じ名前と引数型の2つの提案があります。

どのメソッドが呼び出されるかはどのように決定されますか?

これは、呼び出される引数を持つメソッドですが、私が呼びたいと思ったものが計算を含むinit(windSpeedMilesPerHourパラメータの値を指定しない)ですか?

+0

私はそれは同じことをメソッドに命名することは悪い考えだと思う... – davecom

+1

はい、そうです。しかし、私はこれがどのように許可されているのが不思議ですか? –

+0

気象構造の外で天気を呼び出しているのはなぜですか? –

答えて

1

あなたの例からすべてのドロスを剥奪簡単なテスト、あなたに答えを伝えます:

struct S { 
    init(a:Int) { 
     print("first one") 
    } 
    init(a:Int, b:Int=3) { 
     print("second one") 
    } 
} 
let s = S(a:4) // "first one" 

だから、基本的には、第1の初期化子は、それは不可能明示的bパラメータなく、第2の初期化子を呼び出すようになりました。それは愚かなことです - bのデフォルト値を無用かつ無意味なものにしましたが、それは違法ではありませんし、そうするべき理由もありません。

+0

はい、私は最初のものが(私が質問で言ったように)呼び出されることを知っています。しかし、より深い説明がありますか?なぜなら、bパラメ​​ータを持つinitは、 –

+2

の代わりに呼び出されていないのです。なぜ、私はすでに言ったことを超えて、その理由で「なぜ」という言葉の意味を理解しません。それは、あなたが2番目のイニシャライザは、最初のイニシャライザとともにただ1つのパラメータで呼び出されます。 Swiftには、コードが意味するものを決定するヒューリスティックがあります。非常にばかげたエッジケースですが、クラッシュすることはなく、コンパイラはあなたを叩いていません。 「なぜ」が「舞台裏で起こっていること」を意味するのであれば、ソースを突き抜けて把握してください。 Swiftはオープンソースです。個人的に私はそれをブラックボックスとして扱うことを好む。 – matt

関連する問題