Мы знаем, что можем использовать if let
оператор в качестве сокращения, чтобы проверить наличие необязательного nil, а затем развернуть.
Однако я хочу объединить это с другим выражением, используя логический оператор AND &&
.
Так, например, здесь я выполняю необязательную цепочку, чтобы развернуть и, при необходимости, уменьшить свой rootViewController до tabBarController. Но вместо того, чтобы иметь вложенные операторы if, я бы хотел их объединить.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Комбинированная подача:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Вышеуказанное дает ошибку компиляции. Использование неразрешенного идентификатора tabBarController.
Упрощение:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Это дает ошибку компиляции. Связанное значение в условной привязке должно иметь тип Optional . После попыток различных синтаксических вариаций каждая из них выдает разные ошибки компилятора. Мне еще предстоит найти выигрышную комбинацию порядка и скобок.
Итак, вопрос в том, возможно ли это, и если да, то каков правильный синтаксис?
Обратите внимание , что я хочу сделать это с if
заявлением не в switch
заявлении или тройным ?
оператором.
источник
var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
if let bar = foo && bar == 10
естьUse of unresolved identifier "bar"
(на второмbar
, конечно).bridgeToObjectiveC
отсутствует в бета-версии 5 (и, вполне возможно, никогда не предназначался для общего использования). 2. В любом случае естьfirst
метод встроенногоArray
типа Swift .Ответы:
В Swift 1.2 это возможно . В примечаниях к выпуску бета-версий Swift 1.2 и Xcode 6.3 говорится :
С приведенным выше утверждением синтаксис будет таким:
Здесь используется
where
предложение.Другой пример, на этот раз приведение
AnyObject
кInt
, разворачивание необязательного и проверка того, что развернутый необязательный элемент соответствует условию:Для тех, кто сейчас использует Swift 3, «где» заменено запятой. Таким образом, эквивалент будет:
источник
В Swift 3 Max пример Маклеода выглядел бы так:
where
Был заменен,
источник
if let
может продолжаться только в том случае, если необязательный параметр успешно развернут и ему присвоено новое имя переменной. Если бы вы сказали,OR <something else>
вы могли бы легко обойти всю цельif let
. Для логического ИЛИ просто выполните обычноеif
и внутри тела дело с тем фактом, что первый объект все еще является необязательным в этой точке (не развернутым).Ответ Макса правильный и один из способов сделать это. Обратите внимание, что когда написано так:
if let a = someOptional where someBool { }
someOptional
Выражение будет решен первым. Если это не удается,someBool
выражение не будет оцениваться (оценка короткого замыкания, как и следовало ожидать).Если вы хотите написать это наоборот, это можно сделать так:
if someBool, let a = someOptional { }
В таком случае
someBool
сначала оценивается, и только если оно истинно,someOptional
вычисляется выражение.источник
Swift 4 , я буду использовать,
источник
Это невозможно.
Из грамматики Swift
Если-условие должно быть выражением или объявлением. У вас не может быть одновременно выражения и декларации.
let foo = bar
является декларацией, она не оценивает значение, которое соответствуетBooleanType
. Он объявляет константу / переменнуюfoo
.Ваше исходное решение достаточно хорошее, оно гораздо более читабельно, чем сочетание условий.
источник
let foo = bar
- это объявление, а не выражение. вы не можете сделатьlet boolValue = (let foo = bar)
Я думаю, что ваше первоначальное предложение не так уж и плохо. Альтернативой (более сложной) будет:
источник
tabBarController
повторить трансляцию