代码中,我检查系统函数是否等于零,如果是,则返回其他值,如果不是,则返回测试值。
(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 一起使用?
(仅供参考:我投票支持陈布莱恩)