Swift сильно отличается от C ++, поэтому не стоит удивляться, что синтаксис C ++ не работает в Swift.
Существует два типа операторов if
в Swift: тип, который принимает выражение (if foo.bar
), и тип, который выполняет сопоставление с образцом (if let foo = bar
, if case .some(let foo) = bar
и т. Д.).
Поскольку Swift поддерживает выражения в скобках, if foo.bar
работает так же, как if (foo.bar)
: в первом случае условие foo.bar
, а во втором случае условие (foo.bar)
. Другими словами, круглые скобки здесь являются частью выражения условия, а не частью оператора if
. Это отличается от C ++, где круглые скобки являются частью оператора if
. Однако в обоих случаях вы можете добавить столько скобок, сколько хотите: if (((((((((foo.bar)))))))))
, хотя и глупо, внешне допустимо на обоих языках.
Напомним, что вы можете заключить произвольные выражения в скобки, но вы не можете просто заключить что-либо в скобки. Вы не написали бы (if foo.bar)
на Swift или C ++, потому что знаете, что if
не является выражением. Затем то же самое относится к let foo = bar
. Это также не выражение, поэтому вы не можете заключить его в скобки. if let foo = bar
нормально, но if (let foo = bar)
нет.
C ++ поддерживает похожий синтаксис в некоторых случаях:
if (auto foo = make_unique<int>(3)) { ... } else { ... }
Этот синтаксис объявляет foo
и проверяет его (используя operator bool()
), а затем соответствующим образом выполняет ветвление программы. Поскольку условие является оператором объявления, а не выражением, оно также не может быть заключено в дополнительные скобки: if ((auto foo = make_unique<int>(3)))
- это ошибка времени компиляции, как и if (let foo = bar)
в Swift.