С Swift 5.2
Возможно, вы помните, что операторы if let
можно объединить в цепочку с запятой.
let o1:Int? = 1 let o2:Int? = 2 if let one = o1, let two = o2 { print(one, two) } // Output: 1 2
Запятая здесь действует как эквивалент логического &&
. Код внутри оператора if не будет выполняться, если оба o1
и o2
не равны nil
.
Также можно связать логическое выражение после оператора let
. В случае ниже мы проверяем, что one
не является nil
, а также что 1 › 0.
let o1:Int? = 1 if let one = o1, one > 0 { print(one) } // Output: 1
Однако интересным побочным эффектом этого синтаксиса является то, что ,
и &&
могут использоваться взаимозаменяемо. Другими словами, нам не нужно начинать оператор с if let
, чтобы можно было использовать запятую. Это означает, что следующий код скомпилируется и запустится, как и ожидалось:
let one = 1 let two = 2 if one > 0, two > 1 { print(one, two) } // Output: 1, 2 if one > 0 && two > 1 { print(one, two) } // Output: 1, 2
Разница в нюансах заключается в том, что one > 0 && two > 1
оценивается как одно целое выражение, тогда как one > 0, two > 1
обрабатывается как два независимых выражения. Какой путь вы выберете, зависит скорее от стилистического решения.
Я бы сказал, что для простых выражений one > 0 && two > 1
более удобочитаемо. &&
ясно передает смысл выражения. Однако для сложных выражений использование &&
требует большего внимания к скобкам и порядку операций. Я бы сказал, что это менее читабельно и более подвержено ошибкам по сравнению со стилем, основанным на запятых.
Использование &&
:
if (this || that) && something() && (another == 1 || example == 6)
Использование ,
:
if this || that, something(), another == 1 || example == 6
По этой причине я решил использовать запятые всякий раз, когда логические выражения выходят за пределы одного &&
.
Дайте мне знать, если у вас есть какие-либо мысли, и посмотрите этот пост на forums.swift.org для более подробного обсуждения этого фрагмента синтаксиса.