Я прочитал В 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' isnВызов всех путей перед возвратом из инициализатора
Вопрос2:
ПОЧЕМУ? почему init
должен вызывать self.init()
, это похоже на рекурсивный цикл.