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)
在我的代码中,我检查系统函数是否等于零,如果是我 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)