使用If-Let并在一行中检查输出

时间:2016-01-02 21:32:36

标签: ios swift swift2

这只是一个例子来说明我想要实现的目标。

我想检查一个可选项是否包含一个值,如果它是否大于0.我现在有这样的方式:

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

有没有办法在一条线上实现这一目标?类似的东西:

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

5 个答案:

答案 0 :(得分:9)

您可以使用where子句:

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

使用nil coalescing operator的另一个选项:

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

感谢下面的评论让我意识到nil > 0不会抛出错误:

if Double(textFieldText) > 0 {

是迄今为止最简单的选择。

答案 1 :(得分:6)

1行解决方案

我认为编写逻辑的最简单方法是

return Double(textFieldText) > 0

测试

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

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

为什么这样做?

当在Swift中比较2个值并且(确切地)其中一个值为nil时,nil总是小于另一个值。

因此每次Double的初始化失败时都会失败,就像这里

一样
return Double("a") > 0

表达式变为

return nil > 0

false

表达式返回true的唯一方法是将输入字符串解析为Double值,该值实际上大于0。 这正是您寻找的逻辑:)

答案 2 :(得分:4)

使用where子句:

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

或者简单地说:

if Double(textFieldText) > 0 {
    return true
}

答案 3 :(得分:2)

另一种方法是你可以做同样的事情,如果让我们筑巢,你会引导你远离丑陋。

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

答案 4 :(得分:0)

试试这个。

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