对可选值与默认值 -1 感到困惑

Confused about Optional vs Default value -1

我们正在 Swift 项目中工作。那里有一个功能,

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 没有任何意义。这只是一个神奇的词。很难支持、重构和处理这种情况。

第二个更好,如你所愿

if let v = getSleepAmmount() {}

但是有了第一个

 let v =  getSleepAmmount() 
 if v > 0 {}

返回 nil 意味着这不是有效的 return 而 -1 可能意味着检查代码的新开发人员会误解的另一件事

返回 nil 是比使用任何 垃圾值或默认值 更好的解决方案。

返回任何 默认值 将来可能会与实际结果发生冲突。

此外,可能还有其他开发人员在处理相同的代码。所以,使用 nil 会比使用 -1.

有更好的解释

如果调用者中的代码只应 运行 如果有有效的睡眠量,那么可选是更好、更清晰的方法。这正是 guard letif let 的设计目的:

guard let sleepAmount = getSleepAmount() { else return }

// do something with sleepAmount

更好的方法是在函数内部抛出一个错误:

func getSleepAmmount() throws -> Int {
    // calculate sleep time
    // return when valid
    // else
    throw InvalidSleepAmount
}

然后

do {
    let sleepAmount = try getSleepAmount()
    // do something with it
} catch InvalidSleepAmount {
    // error processing
}

(如果您愿意,您的函数可以抛出不同的错误,以便调用者了解 为什么 睡眠量无效,SleepTooShortSleepTooLong , NoSleep 等)