Swift 混淆可选值与默认值-1
我们正在一个Swift项目中工作。有一个函数是这样的Swift 混淆可选值与默认值-1,swift,coding-style,optional,default-value,Swift,Coding Style,Optional,Default Value,我们正在一个Swift项目中工作。有一个函数是这样的 fun getSleepAmmount() -> Int { // calculate sleep time // return value when valid // else return -1 } 我的团队成员更喜欢上面的函数,其中调用者需要使用-1进行检查,这不是我所熟悉的。我的建议是使用nil return重新设计,尽管调用方仍然需要检查空性,例如 fun getSleepAmmount()
fun getSleepAmmount() -> Int {
// calculate sleep time
// return value when valid
// else
return -1
}
我的团队成员更喜欢上面的函数,其中调用者需要使用-1进行检查,这不是我所熟悉的。我的建议是使用nil return重新设计,尽管调用方仍然需要检查空性,例如
fun getSleepAmmount() -> Int? {
// calculate sleep time
// return value when valid
// else
return nil
}
但我的同事们不想重新设计。哪个版本的函数更干净?为什么?显然,nil更干净。因为-1没有任何意义。这只是一个神奇的词。很难支持、重构和处理这种情况。显然,nil要干净得多。因为-1没有任何意义。这只是一个神奇的词。很难支持、重构和处理这种情况。第二步是最好的
if let v = getSleepAmmount() {}
但首先
let v = getSleepAmmount()
if v > 0 {}
返回nil意味着这不是一个有效的返回,而-1可能意味着另一件新开发人员无法理解的事情,即检查代码的新开发人员秒是最好的
if let v = getSleepAmmount() {}
但首先
let v = getSleepAmmount()
if v > 0 {}
返回nil意味着这不是一个有效的返回,而-1可能意味着检查代码的新开发人员将无法理解的另一件事返回nil是一个更好的解决方案,而不是使用任何垃圾或默认值
返回任何默认值可能在将来与实际结果发生冲突
此外,可能还有其他开发人员处理相同的代码。因此,使用nil比使用-1有更好的解释。返回nil是一个更好的解决方案,而不是使用任何垃圾或默认值
返回任何默认值可能在将来与实际结果发生冲突
此外,可能还有其他开发人员处理相同的代码。因此,使用nil比使用-1有更好的解释。如果调用者中有代码只有在有有效睡眠量的情况下才应该运行,那么optionals是更好、更清晰的方法。这正是guard let和if let的设计目的:
guard let sleepAmount = getSleepAmount() { else return }
// do something with sleepAmount
更好的方法是在函数内部抛出错误:
func getSleepAmmount() throws -> Int {
// calculate sleep time
// return when valid
// else
throw InvalidSleepAmount
}
然后
如果您愿意,您的函数可以抛出不同的错误,以便调用者知道为什么睡眠量无效、SleepTooShort、SleepTooLong、NoSleep等如果调用者中的代码只有在存在有效睡眠量的情况下才应该运行,那么optionals是更好、更清晰的方法。这正是guard let和if let的设计目的:
guard let sleepAmount = getSleepAmount() { else return }
// do something with sleepAmount
更好的方法是在函数内部抛出错误:
func getSleepAmmount() throws -> Int {
// calculate sleep time
// return when valid
// else
throw InvalidSleepAmount
}
然后
如果您愿意,您的函数可以抛出不同的错误,以便调用者知道为什么睡眠量无效、SleepTooShort、SleepTooLong、NoSleep等等,但是您的同事可能担心它会更改一个API,这可能会对其他地方的测试和更改产生连锁反应。@JeremyP它还没有那么多调用方。如果它是一个新函数,那么可选版本肯定是正确的选择。如果你的同事真的需要他的-1,他可以写getSleepAmount-1显然,可选版本更干净,请看答案,但您的同事可能担心它会更改API,这可能会对其他地方的测试和更改产生连锁反应。@JeremyP它还没有那么多调用方。如果它是一个新函数,可选版本肯定是正确的选择。如果你的同事真的需要他的-1,他可以写getSleepAmount-1例外情况没有用处。他们只是“又回来了”。如果逻辑复杂,则很难处理它们。如果出现多个不需要的状态,并且调用方需要知道函数的特定状态以进行不同的处理,则异常可能很好。在我的例子中,返回nil就足以让调用方知道单个无效状态。异常是没有用的。他们只是“又回来了”。如果逻辑复杂,则很难处理它们。如果出现多个不需要的状态,并且调用方需要知道函数的特定状态以进行不同的处理,则异常可能很好。在我的例子中,返回nil就足以让调用者知道单个无效状态。