In swiftを読みました。初期化子があるときにプロトコルをインスタンス化できないのはなぜですか?
私の質問は、コンパイラがデフォルトの実装を調べて、それに基づいてオブジェクトを初期化できない理由に焦点を当てていますか?
protocol ViewModel {
var radius: Int { get }
init()
}
extension ViewModel {
var radius: Int { return 2}
init() {}
}
let v = ViewModel() // ERROR:
プロトコル タイプ 'ViewModel' をインスタンス化できません
質問1:
Swift がプロトコルの標準的な初期化を許可しないのはなぜですか? なぜ具象型に結び付けなければならないのですか?
具体的なタイプではないことがわかりました。しかし、なぜコンパイラは、デフォルト値のプロトコル以外の何物でもない型を作成することを許可しないのでしょうか?! それは、私があなたをインターフェース/プロトコルまたは実際のタイプと考えることができる間、コンパイラがちょっと聞いているようなものだからですか。お二人とは思えない!? あなたは、記憶の中の現実のものか、単なる青写真のどちらかです。
拡張機能がすべての要件の実装を提供しているかどうかを言語が確認できた場合、それを特別なケースとして初期化できるようにすることは理にかなっているでしょうか? (そうではないことは理解していますが、これを機能させるために必要なのは唯一のことだと思います)または、それでも意味がありませんでした。もしそうなら、なぜですか?
さらに、代わりにこれを試しました:
protocol ViewModel {
var radius: Int { get }
init()
}
extension ViewModel {
var radius: Int { return 2}
init() {
self.init() // Line A:
}
}
struct ReallyNothing: ViewModel {}
let v = ReallyNothing()
LineA をコメントアウトすると、次のエラーが発生します
「self.init」は、初期化子から戻る前にすべてのパスで呼び出されるわけではありません
質問2:
なぜ?なぜそれinit
を呼び出す必要があるのですか?self.init()
再帰ループのように思えます。