斯威夫特三元,返回测试值


在我的

代码中,我检查系统函数是否等于零,如果是,则返回其他值,如果不是,则返回测试值。

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

这是一个更好,更干净的方法来做到这一点?我不想调用该函数两次...我知道我能做到

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

但这需要两条线...

最干净的方法?

let value = someLongFunc()
if value == 0 {
   return otherValue 
} else {
   return value
}

我向你保证,每个阅读它的人都会毫不犹豫地理解它。你可以做一些运算符或辅助函数,但什么是真正的"干净方式"?代码行数更少?我强烈不同意这种说法。在"干净的代码"中,可读性比破解一个行要重要得多,只有可怕的人才会滥用三元运算符。

你控制verylongfunc吗? 如果是这样,0 是否是一种特例,意味着某种失败或不可能返回? 如果是这样,让它返回 nil,那么你可以做

class.verylongfunc(arg, arg) ?? othervar

如果没有,请创建自己的运算符:

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

为了扩展 Lou Franco 的答案,如果您不控制 verylongfunc ,则可以将系统函数包装在一个返回 optional

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

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

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

另一个单行解决方案。

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

FruitAddict对现实生活中的代码有最好的想法(人们可以理解谁在你之后)&Bryan Chen 如果这个问题由 Spok 解释,具体要求是 1 行风格,那么 Bryan Chen 有最聪明的解决方案;然而,Chen的解决方案并不是真正的1行,因为你必须写第二行=>"返回结果"来满足特定的语义("RETURN otherval..."好像你的代码行在一个函数内)的问题。 要修复 Chen 的解决方案,您实际上可以使用带有 RETURN 的三元运算符:

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

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

这将是对这个问题最肛门的回答。

但它也回答了另一个很酷的问题:如何将三元运算符与 RETURN 一起使用?

(仅供参考:我投票支持陈布莱恩)

最新更新