2016-04-22 3 views
-3

編集:完成し、Why doesn't this obvious infinite recursion give a compiler warning? の重複は、私も警告を期待するのが妥当だった初期化子指定されたシステムをスウィフトが持っている多くの巧妙な警告を与えられたとすると考えられますが、上記で説明したように、これは、間違っています。Swift Initialiser Bug?

私も構造体をそのネジを実現し、その後、プロトコル拡張で遊んでこの興味深い例を見つけました。

struct WhatThe { 
let a = 1 
init(value: Int) { 
    self.init() 
} 

init() { 
    self.init(0) 
} 
} 

print(WhatThe().a) //nothing is printed and the CPU goes nuts. 

これはバグではありませんか?私はこれが無限ループだと理解しています。私はAppleがこれを許したことに本当に驚いています。 このコードには警告はなく、うまく構築され、Playgroundでも実行されます。 私はこの種のものが言語を取り除く明らかな問題であったように感じます。これらは両方とも利便性の初期設定者なので、クラスでうまくいくのですか?

+0

これはバグではなく、かなり一般的_developerのERROR_ある_infinite recursion_、ある無限ループの特殊なケースではなく、具体的スウィフト初期化子に関連するどのような方法ではありません。さらに簡単なイニシャライザの例は、 'Foo'インスタンスが初期化されたときの無限再帰を呼び出す(上記の例のように)' struct Foo {init(){self.init()}} ';ちょうど自分自身を呼び出す再帰関数のよりよく知られている無限の再帰例と容易に比較できる、 'FUNCのFOOを言う(){FOO()}'と呼ばれる無限の再帰を呼び出します。 'foo()' – dfri

+1

この質問の根拠は実際にはスウィフト言語特有のものではないため、 [Cの無限再帰](http://stackoverflow.com/questions/18227093/infinite-recursion-in-c)または[なぜ、この明白な無限再帰は、コンパイラの警告を与えるものではありません?](http://stackoverflow.com/questions/8762234/why-doesnt-this-obvious-infinite-recursion-give-a-compiler-warning)(この後者の方は閉じていますが、コンパイラーの警告がなぜ無限の再帰を捕まえることができないのかをよく知っています)。 – dfri

+0

ありがとう、それはそれを解決しました。 // stackoverflowの:私は、元のhttpがhttp://stackoverflow.com/questions/8762234/why-doesnt-this-obvious-infinite-recursion-give-a-compiler-warningの重複としてそれを閉じるために投票しました。 com/questions/18227093/infinite-recursion-in-cは私の心の中で本当に同じ質問ではありません。 –

答えて

2

これは無限ループの場合に過ぎません。init()関数はinit(value:)を呼び出し、init()を呼び出すなどして終了しません。さて、スタックがオーバーフローしてクラッシュすると終了します。

+0

申し訳ありませんが私は明確にされている必要があります。私はこれを知っている(それは私に数秒かかった)が、私はこれがコンパイルできることに驚いている! –

+2

このループに気づくために、コンパイラはあなたのコードを実行する必要があります。これはコンパイラの仕事ではありません。どちらの関数も有効です。それがコンパイルされる理由です。 – EmilioPelaez

+0

ループには問題はありませんが、指定されたイニシャライザが他の指定されたイニシャライザを呼び出しています。見知らぬ人でも、 'let a:Int'を使うと' a'にデフォルト値がないので、 'a'が割り当てられる前に' self'が参照されていてもコードは*まだ*コンパイルされます。 – BallpointBen