У меня есть класс, скажем, 100 свойств (преувеличение).
Большинство этих свойств должны быть вычислены на основе пользовательских предпочтений.
Эти свойства не изменятся после инициализации, поэтому я хотел бы запустить вычисления один раз в начале и установить результаты в let
properties
Пользователи могут устанавливать десятки предпочтений, и в зависимости от заданной комбинации предпочтений свойства здесь изменятся при инициализации объекта.
let prop1:String
let prop2:String
...
let prop100:String
init(maybeRelevantArg:Int, maybeRelevantArg2:String) {
var proposedProp1 = ""
//20 lines of logic to compute proposedProp1, referencing preferences and maybeRelevantArgs
self.prop1 = proposedProp1
var proposedProp2 = ""
//20 lines of logic to compute proposedProp2, referencing preferences and maybeRelevantArgs
self.prop2 = proposedProp2
}
Вы поймете, в этот момент мои init
будут иметь сотни строк, в основном не читаемые.
Я хотел бы разделить эти куски логики на отдельные методы, что-то вроде:
init(maybeRelevantArg:Int, maybeRelevantArg2:String) {
self.computeAndSetProp1(relevantArg:maybeRelevantArg1)
self.computeAndSetProp2(relevantArg:maybeRelevantArg2)
}
func computeAndSetProp1(relevantArg:String) {
var proposedProp1 = ""
//20 lines of logic to compute proposedProp1, referencing preferences and relevantArgs
self.prop1 = proposedProp1
}
Таким образом, init
гораздо более читабелен, и его легче отлаживать и поддерживать.
Проблема в том, что, очевидно, компилятор не будет рад, что мой init
метод явно не инициализирует эти свойства, и я получаю что-то похожее на:
'self' используется до инициализации всех сохраненных свойств
а также внутри computeAndSetProp1()
я получу эту ошибку:
нельзя присвоить свойству: prop1 - это постоянная let, 1029 *
Есть ли способ разделить этот большой инициал?