Возможно ли иметь логическое сравнение и присваивание переменных в одной строке в Swift?

#swift

#быстрый

Вопрос:

Следующее выдает ошибку.

 if (
  CommandLine.arguments[1].range(of: ".json$", options: .regularExpression, range: nil, locale: nil) != nil amp;amp;
  let _config = loadConfig(CommandLine.arguments[1])
) {
  self.config = _config
} else {
  showAlert("Invalid config file")
  terminate()
}
 

Ответ №1:

Да, это возможно с if-let помощью (вот еще немного информации о if-let):

 if
    let _ = CommandLine.arguments[1].range(of: ".json$", options: .regularExpression, range: nil, locale: nil),
    let _config = loadConfig(CommandLine.arguments[1])
{
    self.config = _config
}
else
{
    showAlert("Invalid config file")
    terminate()
}
 

Итак, здесь разница с вашим кодом заключается в том, что amp;amp; заменяется на , (и скобки ( ... ) не нужны).

Вы также можете использовать guard-let (здесь немного больше информации о guard-let):

 guard
    let _ = CommandLine.arguments[1].range(of: ".json$", options: .regularExpression, range: nil, locale: nil),
    let _config = loadConfig(CommandLine.arguments[1])
else
{
    showAlert("Invalid config file")
    terminate()
    
    return // Return is needed in guard-let.
}

self.config = _config
 

guard-let особенно полезно в функциях. Вы можете выйти из функции, если ваши условия не выполнены. В противном случае ваши определенные let / var -переменные доступны в функции.

Комментарии:

1. Спасибо, Джерун! Мне нужно сначала проверить, является ли CommandLine.arguments[1] файл JSON … возможно ли это?

2. Я отредактировал свой ответ, теперь он сначала проверяет, является ли он допустимым JSON, а затем loadConfig() вызывается.

3. Вы можете еще больше улучшить этот ответ, заменив сравнение != nil на _ let = в обоих случаях. if _ = CommandLine.arguments[1].range(of: ".json$", options: .regularExpression, range: nil, locale: nil), ...

4. Спасибо за помощь, Джерун!

5. Ты прав, @JoakimDanielson, я изменил свой ответ. Рад, что я смог помочь, Санкнудсен.