Я изучаю Swift, и поскольку в Linux теперь есть компилятор, я его установил и протестировал некоторые программы. И есть одна вещь, которую я не понимаю. Почему этот надуманный пример дает ошибку во время компиляции?Переменная область в блоке
var x = 86;
if x <= 32 {
++x;
print(x);
} else if x >= 86 {
x = 2 * x;
print(x);
var x = false;
if !x {
print(x);
}
} else {
--x;
print(x);
}
print(x);
ошибка:
15.swift:7:5: error: use of local variable 'x' before its declaration
x = 2 * x;
^
15.swift:9:9: note: 'x' declared here
var x = false;
^
15.swift:7:13: error: use of local variable 'x' before its declaration
x = 2 * x;
^
15.swift:9:9: note: 'x' declared here
var x = false;
^
15.swift:8:11: error: use of local variable 'x' before its declaration
print(x);
^
15.swift:9:9: note: 'x' declared here
var x = false;
^
Почему это так? Я имею в виду, это не магия, соответствующий пример в C++ работает как можно себе представить:
#include <iostream>
using namespace std;
int main() {
int x = 86;
if (x <= 32) {
++x;
cout << x << endl;
} else if (x >= 86) {
x = x * 2;
bool x = false;
if (!x) {
cout << x << endl;
}
} else {
--x;
cout << x << endl;
}
cout << x << endl;
return 0;
}
Так что мой вопрос: я просто найти ошибку в Swift компилятора или это просто, что Свифт использует некоторую менее интуитивную область видимости семантику? Если да, где я могу прочитать об этом? Кажется, так странно.
Я думаю, что C++ пример страдает от серьезных проблем читаемости, что может привести к трудно найти ошибки, потому что 'x' относится к совершенно разные вещи в одном контексте. Я не знаю, когда это хорошая идея использовать этот шаблон. Предупреждения Swift намного лучше, ИМХО. – Rob
Но это не только предупреждения. Swift отказывается выполнять мой код. И мне интересно, все в порядке. Я знаю, что пример C++ не является хорошим кодом. Но дело не в этом. Дело в том, что я думаю, что я должен иметь возможность переопределять переменную в другой области - в блоке. Это работает на C++, и я уверен, что это более интуитивно понятно для многих программистов. – xan
Это странно, потому что он компилируется на Xcode. Может быть, ошибка Linux? – sunshinejr