Использование 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
}