У меня есть следующие коды:
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ilStringProperty<String>
class ilStringProperty<String>: ILProperty<String> {
}
let x = ILStringProperty("X")
Последняя строка - это ошибка компиляции:
'ILStringProperty' не может быть сконструирован, потому что у него нет доступных инициализаторов
Если я переопределяю init:
override init(_ value: String) {
super.init(value)
}
будет работать, но мне это не нравится. Почему мне нужно переопределять его, когда я не буду добавлять/изменять его?
Я что-то делаю неправильно?
Обновление: последующие вопросы к ответам Никиты Леонова и Икаро
Прежде всего, для всех свойств должно быть значение по умолчанию, я думаю, что я удовлетворил это правило, когда опциональный var по умолчанию имеет значение nil, не так ли? Хотя даже если я пишу var value: T? = nil
, это не решает.
Затем из той же documentation раздела "Автоматическое наследование инициализатора":
инициализаторы суперкласса автоматически наследуются, если выполняются определенные условия
Одно из условий:
Если ваш подкласс не определяет какие-либо назначенные инициализаторы, он автоматически наследует все его инициализаторы, назначенные суперклассам.
Где я действительно думаю, что приведенный выше код действительно соответствует. Это действительно будет работать, если я не буду использовать generics:
class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
Должно ли это правило также применяться к родовым классам?