Swift三元,return测试值

Swift Ternary, return tested value

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

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

这里有更好更简洁的方法吗?我不想调用该函数两次... 我知道我可以做到

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

但是需要两行...

你控制verylongfunc吗?如果是这样,0 是一个特例,意味着某种失败或不可能 return?如果有,就return nil,那你就可以

class.verylongfunc(arg, arg) ?? othervar

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

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

为了扩展 Lou Franco 的回答,如果您不控制 verylongfunc,您可以将系统功能包装在 return 的功能中一个可选的:

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

那么你可以这样使用它:

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

最干净的方法?

let value = someLongFunc()

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

我向您保证,阅读它的每个人都会毫不犹豫地理解它。您可以编写一些运算符或辅助函数,但 "clean way" 到底是什么?更少的代码行?我强烈不同意这一点。在 "clean code" 中,可读性比破解一行更重要,只有糟糕的人才会滥用三元运算符。

另一种一行解决方案。

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

FruitAddict 对现实生活代码有最好的想法(人们可以理解谁在你之后) & Bryan Chen 有最聪明的解决方案,如果这个问题是由 Spok 解释的,具体要求是 1 行样式; 但是,Chen 的解决方案并不是真正的 1 行,因为您必须编写第二行 => 'return result' 以满足特定语义("RETURN otherval..." 就好像您的代码行在函数内部一样)这个问题。要修复 Chen 的解决方案,您实际上可以将三元运算符与 RETURN:

一起使用

return { $0 == 0 ?其他变量:$0}(class.verylongfunc(arg, arg))

颜色注释:“$0”表示 "an object" 或类似于 'self' 的表达式,在这种情况下由括号内的内容表示。 Chen 的大括号“{}”充当 "computed property" 但在本例中充当 return 值,并且在大括号内使用三元运算符。

这将是对这个问题最直白的回答。

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

(仅供参考:我投票赞成 Bryan Chen)