Я пытаюсь написать два класса Swift, один из которых является подклассом другого и должен взять один из свойств суперкласса и используйте это, чтобы настроить свое «я».Swift подзаряд «init» должен установить все свойства перед вызовом super, но свойство требует, чтобы init init завершился первым
class BaseClass {
let someValue: Double
let size: CGSize
init (size: CGSize) {
self.size = size
self.someValue = size.width/2.0 //Doesn't really matter how this is calculated
}
}
class Subclass: BaseClass {
let someNewValue: Double
override init(size: CGSize) {
super.init(size: size)
self.someNewValue = self.someValue * 2
}
}
Проблема заключается в том, что подкласс требует, чтобы его вызов super.init
после он устанавливает начальные значения для всех его свойств. Однако вызов self.someNewValue = self.someValue * 2
, который делает это, полагается на init супер, который был вызван первым, чтобы установить self.someValue
. Думаю, я мог обойти это, повернув let someValue: Double
на var someValue: Double
на BaseClass, а затем установите его значение в init, а также в init, но это просто кажется плохим.
Я didn Не знаете, что вы можете установить значение по умолчанию, а затем изменить его в init. Я думал, что цель создания переменной let заключается в том, что после ее установки ее нельзя изменить. Угадайте, я буду использовать этот метод, хотя, я пытаюсь избежать дополнительных типов в Swift на данный момент, потому что я нахожу это запутанным, с несколькими различными типами опций. – jamone
Да, константные переменные экземпляра экземпляра могут быть изменены внутри init. В этом случае иногда требуются необязательные опции. Ваш пример имеет свойство Double type, что очень просто. Иногда, однако, у вас сложный тип, и сложно или дорого установить любое значение по умолчанию. – Kirsteins
Я просто попытался добавить '' 'let someArray = [1, 2, 3]' '', а затем в init вызовет '' 'self.someArray.append (4)' '', и он сработал. Таким образом, все неизменяемые объекты изменяются внутри init. Это похоже на беспорядок. – jamone