2014-09-30 3 views
3

Я пытаюсь написать два класса 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, но это просто кажется плохим.

ответ

2

Я вижу два решения здесь:

Make someNewValue неявно развернутого дополнительного

class Subclass: BaseClass { 
    let someNewValue: Double! 

    override init(size: CGSize) { 
     super.init(size: size) 
     self.someNewValue = self.someValue * 2 
    } 
} 

или дают someNewValue значения некоторому по умолчанию, прежде чем вычислить его конечного значение

class Subclass: BaseClass { 
    let someNewValue: Double = 0.0 

    override init(size: CGSize) { 
     super.init(size: size) 
     self.someNewValue = self.someValue * 2 
    } 
} 

Оба approches не должен вызывать любые проблемы

+0

Я didn Не знаете, что вы можете установить значение по умолчанию, а затем изменить его в init. Я думал, что цель создания переменной let заключается в том, что после ее установки ее нельзя изменить. Угадайте, я буду использовать этот метод, хотя, я пытаюсь избежать дополнительных типов в Swift на данный момент, потому что я нахожу это запутанным, с несколькими различными типами опций. – jamone

+0

Да, константные переменные экземпляра экземпляра могут быть изменены внутри init. В этом случае иногда требуются необязательные опции. Ваш пример имеет свойство Double type, что очень просто. Иногда, однако, у вас сложный тип, и сложно или дорого установить любое значение по умолчанию. – Kirsteins

+1

Я просто попытался добавить '' 'let someArray = [1, 2, 3]' '', а затем в init вызовет '' 'self.someArray.append (4)' '', и он сработал. Таким образом, все неизменяемые объекты изменяются внутри init. Это похоже на беспорядок. – jamone

Смежные вопросы