Я писал код и сделал ошибку, которая упрощается до:
func f() -> Int {
for _ in [1,2,3] {
return 1
}
}
И компилятор показывает мне ошибку, говоря, что f
не хватает возврата, что заставило меня осознать свою ошибку. Я забыл поместить оператор if вокруг return
!
Но потом я понял, что компилятор на самом деле лжет! Функция всегда возвращает значение. Или будет? Есть ли ситуация, при которой for l oop не будет l oop?
Я спрашиваю об этом, потому что другие тавтологические конструкции компилируются нормально:
if 1 < 2 {
return 1
}
while true {
return 1
}
И Я также понимаю, что компилятор не может оценивать каждое выражение во время компиляции, чтобы увидеть, являются ли они тавтологиями. Я знаю, что доступ к свойствам и вызовы методов обычно не оцениваются во время компиляции, поэтому не ожидается, что он будет компилироваться:
if "".isEmpty {
return 1
}
Но обычно литералы в порядке, верно? В конце концов, компилятор должен вычислить литерал [1,2,3]
, чтобы преобразовать его в машинный код, который говорит: «Создайте массив с 1, 2, 3».
Так почему же он недостаточно умен, чтобы вычислить для l oop? Будет ли for l oop работать в редких случаях?