Я пытаюсь понять, почему я получаю эту ошибку компилятора в проекте 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()
, говорящую "Variable" self.c ', которая использовалась до инициализации ".
Сначала я думал, что это связано с тем, что компилятор не смог проверить, что метод runCalculation()
не имел доступа к self.c
, но затем я попытался немного смешать метод init:
init () {
self.a = 3
self.c = self.runCalculation()
self.b = 4
}
и на этот раз ошибка "Variable" self.b 'используется до инициализации "(в той же строке self.runCalculation()
). Это указывает на то, что компилятор способен проверять, к каким свойствам обращается метод, и насколько я могу видеть, не должен иметь проблемы с начальным случаем.
Конечно, это тривиальный пример, и я мог бы легко реорганизовать, чтобы избежать вызова метода расчета, но в реальном проекте может быть несколько расчетов, каждый из которых может быть весьма вовлекающим. Я хотел бы иметь возможность отделить логику, чтобы сохранить читаемость.
К счастью, существует простой способ:
init () {
self.a = 3
self.b = 4
self.c = 0
self.c = self.runCalculation()
}
(или используя инициализатор свойств let c = 0
), но я хотел бы понять, почему у компилятора есть проблема с первым примером. Я что-то упускаю или это лишнее ограничение?