斯威夫特:如果两个期权都是零,那么早期回归?

时间:2016-01-13 07:31:13

标签: swift coding-style optional

关于Swift编码风格的两难选择:

假设我们有两个变量,它们都可以是nil(Optionals),我们必须得到其中一个变量的值,如果两者都是零,则必须提前返回。

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 :这解决了代码重复问题,但感觉不是非常迅捷。

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

  self.doLotsOfThings(account)
}

问题是;有没有办法使用guard执行此操作?如果没有,有没有更好的方法来处理这种情况?

感谢。

1 个答案:

答案 0 :(得分:4)

这是nil-coalescing运算符??的用例:

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

或早期返回guard

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

表达式

_account ?? self.defaultAccount
如果_account,则

评估为_account != nil 否则self.defaultAccount

同样??是一个“短路”运算符,如&&||, 这意味着在 在您的情况下,self.defaultAccount甚至不会被评估 _account != nil