Swift三元,返回测试值

时间:2016-03-16 21:21:56

标签: swift ternary

在我的代码中,我检查系统函数是否等于零,如果是,我返回另一个值,如果没有,我返回测试值。

    (class.verylongfunc(arg, arg) == 0) ? othervar : class.verylongfunc(arg, arg)

这是一种更好,更清洁的方法吗?我不想两次打电话给这个功能...... 我知道我可以做到

  let tmp = class.verylongfunc(arg, arg)
  (tmp == 0) ? othervar : tmp

但需要两行......

5 个答案:

答案 0 :(得分:4)

最干净的方式?

let value = someLongFunc()

if value == 0 {
   return otherValue 
} else {
   return value
}

我向你保证,阅读它的每个人都会理解它而不再有任何想法。你可以制作一些操作符或辅助函数,但是什么是"干净的方式"真?更少的代码行?我非常不同意这一点。可读性在"清洁代码"中更为重要。而不是黑客攻击一个内衬,只有可怕的人滥用三元运营商。

答案 1 :(得分:3)

你控制verylongfunc吗?如果是这样,0是一个特殊情况意味着某种失败或没有可能的回报?如果是这样,让它返回零,那么你可以做

class.verylongfunc(arg, arg) ?? othervar

如果没有,请自己创建运营商:

infix operator ??? {}
func ???(num: Int32, defNum: Int32) -> Int32 {
    if num == 0 {
        return defNum
    }
    return num
}

答案 2 :(得分:2)

要扩展Lou Franco的答案,如果您不控制verylongfunc,您可以将系统函数包装在 返回可选项的函数中:

func value() -> Int? {
    let value = Class.verylongfunc()
    return value == 0 ? nil : value
}

然后你可以像这样使用它:

let otherVar = 123
let x = value() ?? otherVar

答案 3 :(得分:2)

另一个一线解决方案。

let result = { $0 == 0 ? othervar : $0 }(class.verylongfunc(arg, arg))

答案 4 :(得分:0)

FruitAddict对真实代码具有最好的主意(人们可以理解谁追随您) 如果Spok解释了这个问题,而Bryan Chen则是最聪明的解决方案,具体要求是1行样式。 但是,Chen的解决方案并不是真正的1行,因为您必须编写第二行=>'return result'以满足特定的语义(“ RETURN otherval ...”就像您的代码行在函数内一样)这个问题。要解决Chen的解决方案,您实际上可以将三元运算符与RETURN一起使用:

返回{$ 0 == 0? othervar:$ 0}(class.verylongfunc(arg,arg))

颜色注释:“ $ 0”表示“对象”或类似于“自我”的表达式,在这种情况下用括号内的内容表示。 Chen的大括号“ {}”充当“计算属性”,但在这种情况下充当返回值,并且在大括号内使用三元运算符。

这是该问题的最肛门答案。

但是它还回答了另一个很酷的问题:如何在RETURN中使用三元运算符?

(仅供参考:我对Bryan Chen表示反对)