Использование If-Let и проверка вывода в одной строке

Это просто пример, иллюстрирующий то, что я пытаюсь достичь.

Я хочу проверить, содержит ли опционально значение и если оно больше 0. В настоящее время я использую его следующим образом:

if let value = Double(textFieldText) {
  if value > 0 {
    return true
  }
}

Есть ли способ достичь этого в одной строке? Что-то вроде:

if let value = Double(textFieldText) && value > 0{
  return true
}

Ответы

Ответ 1

Вы можете использовать предложение where:

if let value = Double(textFieldText) where value > 0 {

Другая опция, использующая nil coalescing operator:

if Double(textFieldText) ?? -Double.infinity > 0 {

Благодаря комментариям ниже, которые помогают мне понять, что nil > 0 не выдает ошибку:

if Double(textFieldText) > 0 {

- самый простой вариант.

Ответ 2

Решение в 1 строке

Я думаю, что самый простой способ написать свою логику - это

return Double(textFieldText) > 0

Test

func foo(textFieldText:String) -> Bool {
    return Double(textFieldText) > 0
}

foo("1") // true
foo("-1") // false
foo("a") // false
foo("0") // false
foo("123a") // false

Почему это работает?

Когда 2 значения сравниваются в Swift и (точно), один из них nil, тогда nil всегда меньше другого значения.

Итак, каждый раз, когда инициализатор Double не работает, как здесь

return Double("a") > 0

выражение становится

return nil > 0

который равен false.

Единственный способ, с помощью которого выражение возвращает true, - это когда синтаксическая обработка входной строки равна значению Double, которая на самом деле больше, чем 0. Это именно та логика, которую вы ищете:)

Ответ 3

С предложением where:

if let value = Double(textFieldText) where value > 0 {
    return true
}

Или просто:

if Double(textFieldText) > 0 {
    return true
}

Ответ 4

Еще один способ, которым вы можете сделать то же самое, и это будет отвлекать вас от уродливости, если пусть вложенность.

   func hello(values:String) -> Bool {
      guard let value = Double(values) where value > 0 else {
         return false
      }     
      return true
   }

Ответ 5

Попробуйте это.

if let value = textFieldText as? Double where value > 0 {
  return true
}