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

Mar*_*elo 14 ios swift swift2

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

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

if let value = Double(textFieldText) {
  if value > 0 {
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在一条线上实现这一目标?就像是:

if let value = Double(textFieldText) && value > 0{
  return true
}
Run Code Online (Sandbox Code Playgroud)

ozg*_*gur 9

你可以使用where条款:

if let value = Double(textFieldText) where value > 0 {
Run Code Online (Sandbox Code Playgroud)

使用nil合并运算符的另一个选项:

if Double(textFieldText) ?? -Double.infinity > 0 {
Run Code Online (Sandbox Code Playgroud)

感谢下面的评论,这些评论帮助我意识到nil > 0不会抛出错误:

if Double(textFieldText) > 0 {
Run Code Online (Sandbox Code Playgroud)

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


Luc*_*tti 6

1行解决方案

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

return Double(textFieldText) > 0
Run Code Online (Sandbox Code Playgroud)

测试

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

foo("1") // true
foo("-1") // false
foo("a") // false
foo("0") // false
foo("123a") // false
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

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

因此每次初始化Double确实失败时,就像这里一样

return Double("a") > 0
Run Code Online (Sandbox Code Playgroud)

表达成为

return nil > 0
Run Code Online (Sandbox Code Playgroud)

是的false.

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