Условие после привязки переменной в проблеме быстрой компиляции guard

#swift #swift-guard

#swift #swift-guard

Вопрос:

Я использую инструкцию nice guard из Swift 3.0 (в Xcode 8.0) и выполняю следующую функцию:

 func parse(suffix s: String) throws -> Instruction {
    guard let count = Int(s) where count >= 0 else {
      throw InstructionParsingError(message: s   " should be a positive integer")
    }
    return CallInstruction(argCount: count)
}
  

Моя проблема в том, что компилятор swift дважды жалуется на строку, содержащую мой оператор guard:

 CallInstruction.swift:42:29: Boolean condition requires 'where' to separate it from variable binding
CallInstruction.swift:42:30: Expected ',' joining parts of a multi-clause condition
  

Я пытался

  • замена where на a , затем вторая ошибка исчезает, но первая все еще существует.
  • замена на where , , where но тогда эта строка даже не может быть проанализирована
  • замена count в where на Int(s) , но с теми же ошибками.

Как я должен изменить свой код, чтобы он компилировался? (Я имею в виду, что с хорошим одним оператором guard, конечно, у меня может быть несколько guard, или ifs, или switch, но из того, что я прочитал о операторе guard, я должен иметь чистую читаемую строку).

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

1. guard let count = Int(s), count >= 0 else должна компилироваться с помощью Swift 3 / Xcode 8. Возможно, какой-то невидимый пробел или управляющий символ в исходном коде?

2. о, хорошо, я очистил свой продукт в xcode после замены, и все ошибки исчезли. Спасибо!

Ответ №1:

Для решения этой проблемы я рекомендую вам использовать синтаксис model Swift в операторе guard, который заменяет where на , .

 func  parse(suffix s: String) {
    guard let count = Int(s), count >= 0 else {
         return
    }
}
  

Также можно использовать if let оператор :

 func  parseTwo(suffix s: String) {
    if let count = Int(s), count >= 0  {
        // done
        print(count)
    } else {
        return
    }
}