如何在 Swift 中 return 具有边缘情况的单个值?

How to return a single value with edge cases in Swift?

我应该 return 一个可选值,例如:

func someFunc(#num: Int) -> Obj? {
  if num < 0 {
    return nil
  }

  ...
}

或者直接使用assert:

func someFunc(#num: Int) -> Obj {
  assert(num >= 0, "Number should greater or equal then zero")

  ...
}

编辑:现在两种情况下的条件相同,数字应大于或等于 0。不允许使用负值。

这取决于您希望函数的前提条件是什么:如果它是一个错误,请使用负值(或非正数;您的两个示例是矛盾的)调用它,然后使用 assert 和 document这个。然后它成为合同的一部分,如果不确定,函数的用户必须检查值。或者,如果支持这些值和 return nil 更有意义(例如,通常会使用此类值调用函数,而 nil 对于该典型用途来说不是问题),而不是那样做……在不知道细节的情况下,不可能说出哪个最适合,但我的猜测是前者。

如果您使用断言并且调用者传递了一个无效参数,则它是不可恢复的 error/crash。调用者可能不知道引起断言的所有方式,即调用者不应该知道的内部逻辑。

真正唯一有意义的断言是检查方法入口的调用参数,即使在那种情况下,也必须向用户明确说明什么是无效的,并且在方法。

因为这是关于 Swift return 一个 Optional 似乎最有意义,并且调用者很清楚必须处理可能的错误。 Optionals 是 Swift 的一个主要特性,使用它们。

或者总是 return 有用的结果 atan() 处理用 ±0 和 ±Inf 调用的方式。