編集:完成し、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でも実行されます。 私はこの種のものが言語を取り除く明らかな問題であったように感じます。これらは両方とも利便性の初期設定者なので、クラスでうまくいくのですか?
これはバグではなく、かなり一般的_developerのERROR_ある_infinite recursion_、ある無限ループの特殊なケースではなく、具体的スウィフト初期化子に関連するどのような方法ではありません。さらに簡単なイニシャライザの例は、 'Foo'インスタンスが初期化されたときの無限再帰を呼び出す(上記の例のように)' struct Foo {init(){self.init()}} ';ちょうど自分自身を呼び出す再帰関数のよりよく知られている無限の再帰例と容易に比較できる、 'FUNCのFOOを言う(){FOO()}'と呼ばれる無限の再帰を呼び出します。 'foo()' – dfri
この質問の根拠は実際にはスウィフト言語特有のものではないため、 [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
ありがとう、それはそれを解決しました。 // stackoverflowの:私は、元のhttpがhttp://stackoverflow.com/questions/8762234/why-doesnt-this-obvious-infinite-recursion-give-a-compiler-warningの重複としてそれを閉じるために投票しました。 com/questions/18227093/infinite-recursion-in-cは私の心の中で本当に同じ質問ではありません。 –