在我的代码中,我检查系统函数是否等于零,如果是,我返回另一个值,如果没有,我返回测试值。
(class.verylongfunc(arg, arg) == 0) ? othervar : class.verylongfunc(arg, arg)
这是一种更好,更清洁的方法吗?我不想两次打电话给这个功能...... 我知道我可以做到
let tmp = class.verylongfunc(arg, arg)
(tmp == 0) ? othervar : tmp
但需要两行......
答案 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表示反对)