Swift:如果两个可选值都为零,则提前 return?

Swift: Early return if both optionals are nil?

Swift 中的编码风格有点进退两难:

假设我们有 2 个变量,它们都可以为 nil(可选),我们必须获取其中一个的值,或者 return 如果两者都为 nil,则尽早获取。

Objective-C中会这样写:

- (void)authenticate:(Account*)anAccount {
  Account* account = anAccount ?: self.defaultAccount();
  if (!account) return;

  doLotsOfThings(account);
}

我可以在 Swift 中想出几种重写它的方法,但它们都引入了代码味道。

Swift: 代码重复

func authenticate(_account: Account?) {
  if let account = _account {
    self.doLotsOfThings(account)
  } else if let account = self.defaultAccount {
    self.doLotsOfThings(account)
  }
}

Swift:这个解决了代码重复但是感觉不是很Swift-y.

func authenticate(_account: Account?) {
  if _account == nil && self.defaultAccount == nil { return }
  let account = _account == nil ? self.defaultAccount! : _account!

  self.doLotsOfThings(account)
}

问题是;有没有办法使用 guard 来做到这一点?如果没有,有没有更好的方法来处理这种情况?

谢谢。

这是 use-case 运算符 nil-coalescing ??:

func authenticate(_account: Account?) {
  if let account = _account ?? self.defaultAccount {
    self.doLotsOfThings(account)
  }
}

或 early-return 与 guard:

func authenticate(_account: Account?) {
  guard let account = _account ?? self.defaultAccount  else {
    return
  }
  self.doLotsOfThings(account)
}

表达式

_account ?? self.defaultAccount

如果 _account != nil 计算为 _account,并且为 self.defaultAccount 否则。

另外 ?? 是一个 "short-circuiting" 运算符,如 &&||, 这意味着在 你的情况 self.defaultAccount 甚至没有被评估如果 _account != nil.