Могу ли я каким-то образом использовать необязательную привязку для нескольких переменных в одной строке в Swift?

Могу ли я каким-то образом использовать необязательную привязку для нескольких переменных в одной строке в Swift? Мне нужно сделать что-то вроде этого:

if let foo = fooOptional && let bar = barOptional { // ... } 

4 Solutions collect form web for “Могу ли я каким-то образом использовать необязательную привязку для нескольких переменных в одной строке в Swift?”

Обновление для Swift 1.2:

Начиная с Swift 1.2 (Xcode 6.3 Beta), вы можете развернуть несколько опций с помощью if let :

 if let foo = fooOptional, bar = barOptional { println("\(foo), \(bar)") } 

Перед Swift 1.2

Вы не можете с if , но вы можете с помощью switch «Value-Binding Pattern» :

 switch (fooOptional, barOptional) { case let (.Some(foo), .Some(bar)): println("\(foo), \(bar)") default: break } 

Это немного неуклюже, но вы можете сделать это с помощью switch на кортеж ваших переменных:

 var fooOptional: String? = "foo" var barOptional: String? = "bar" switch (fooOptional, barOptional) { case let (.Some(foo), .Some(bar)): println(foo + bar) default: break } 

Время, которое я использую, это сверление во вложенный словарь, как большой объект JSON – это здорово, потому что вы можете обрабатывать каждый случай ошибки отдельно:

 switch (dict["foo"], dict["foo"]?["bar"], dict["foo"]?["bar"]?["baz"]) { case let (.Some(foo), .Some(bar), .Some(baz)): // do things case (.None, _, _): // no foo case (_, .None, _): // no bar default: // no baz } 

Перед Swift 1.2

Мне нравится использовать оператор switch для этого, особенно если вы хотите обрабатывать четыре разных случая.

Однако, если вас просто интересует случай, когда оба варианта являются Some , вы также можете сделать это:

 if let (firstName, lastName) = unwrap(optionalFirstName, optionalLastName) { println("Hello \(firstName) \(lastName)!") } 

Если это определение функции unwrap :

 func unwrap<T1, T2>(optional1: T1?, optional2: T2?) -> (T1, T2)? { switch (optional1, optional2) { case let (.Some(value1), .Some(value2)): return (value1, value2) default: return nil } } 

Больше перегрузок: https://gist.github.com/tomlokhorst/f9a826bf24d16cb5f6a3

Это очень разумный запрос на повышение, но, как вы стоите, вы не можете этого сделать. Есть разные причины, но мне нравится думать об этом просто: if let , то действительно одно слово. Это два слова, но коллокация if let означает что-то особенное, как будто это само по себе ключевое слово. Само по себе, if имеет другое значение; само по себе, let имеет другое значение. Следовательно, вы не можете поместить отдельное let позже в строку.

В результате я часто получаю каскады вложенных, if let предложения. Я уверен, что причина вашего вопроса в том, что вы тоже это делаете, и вы хотели бы избежать этого. Но вы не можете. Один из вариантов заключается в том, чтобы пропустить, if let вообще, принудительно развязать ваши варианты и надеяться, что вы не потерпите крах, когда один из них равен нулю.

  • Удалять разделы UITable динамически с помощью commitEditingStyle в Swift
  • Сделайте UITableView «липким на дно»
  • Быстрая отправка данных из дочернего представления в родительский контроллер представления
  • sknode цвет или текстура
  • Ошибка при установке coremltools
  • Подготовьтесь к Segue в Swift
  • Передавать данные между двумя приложениями по схеме URL в swift?
  • Нет такого модуля «Parse» после руководства Parse iOS Swift Quickstart
  • Измените / обновите токен уведомления Firebase или идентификатор экземпляра с помощью кода?
  • Почему мой код не переходит к следующему виду
  • Скрыть баннер «Открыть в приложении» при использовании универсальных ссылок
  • Interesting Posts

    Ошибка с cocoapods link_with после обновления до 1.0.0

    Как использовать UIBezierPath для рисования строки, следующей за событием touch?

    Рассматривать общий экземпляр TypeA как общий экземпляр SuperclassOfTypeA

    как передать локальные html-файлы с помощью массива в xcode

    Как изменить название кнопки «Редактировать / Готово» в UINavigationBar в Swift

    Подкласс UICollectionViewFlowLayout заставляет некоторые ячейки не появляться

    Мой уровень представления не соответствует моему модельному уровню, хотя у меня нет анимации

    Swift Custom UIAlertView

    Могу ли я определить / как, если устройство имеет вибрацию или нет?

    Facebook iOS sdk xcode 4.3 / раскадровки

    Как читать текстовый файл, превращать его в строку, а затем использовать аргументы на нем

    Как задержать всплывающее разрешение push push-уведомлений Swift

    Как подключить открытый ключ сертификата к iOS

    Swift, перемещение содержимого за клавиатурой не сбрасывается после увольнения

    Хранить NSDictionary в брелках

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.