Почему я получаю сообщение об ошибке «Переменная используется перед инициализацией» в строке, в которой я инициализирую переменную в Swift?
Я изо всех сил пытаюсь понять, почему я получаю эту ошибку компилятора в проекте iOS, использующем Swift. Если я создаю следующий класс:
class InitTest {
let a: Int
let b: Int
let c: Int
init () {
self.a = 3
self.b = 4
self.c = self.runCalculation()
}
func runCalculation () -> Int {
return self.a * self.b
}
}
Я получаю сообщение об ошибке компилятора в строкеself.c = self.runCalculation()
говоря "переменная" self.c "используется перед инициализацией".
Сначала я думал, что это потому, что компилятор не может проверить, чтоrunCalculation()
метод не имеет доступаself.c
, но затем я попытался немного смешать метод init:
init () {
self.a = 3
self.c = self.runCalculation()
self.b = 4
}
и на этот раз ошибка «Переменная« self.b »используется перед инициализацией» (на том жеself.runCalculation()
линия). Это указывает на то, что компиляторявляется способный проверять, к каким свойствам обращается метод, и, насколько я могу судить, не должен иметь проблем с исходным регистром.
Конечно, это тривиальный пример, и я мог бы легко изменить рефакторинг, чтобы не вызывать метод расчета, но в реальном проекте может быть несколько вычислений, каждый из которых может быть довольно сложным. Я хотел бы иметь возможность отделить логику, чтобы все было читабельно.
К счастью, есть простой обходной путь:
init () {
self.a = 3
self.b = 4
self.c = 0
self.c = self.runCalculation()
}
(или используя инициализатор свойстваlet c = 0
) но я бы хотел понять, почему у компилятора возникла проблема с первым примером. Я что-то упустил или это ненужное ограничение?