Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 混淆可选值与默认值-1_Swift_Coding Style_Optional_Default Value - Fatal编程技术网

Swift 混淆可选值与默认值-1

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()

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

显然,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就足以让调用者知道单个无效状态。