【问题标题】:Swift: Early return if both optionals are nil?斯威夫特:如果两个选项都为零,则提前返回?
【发布时间】:2016-04-18 01:53:57
【问题描述】:

关于 Swift 中的编码风格有点两难:

假设我们有 2 个变量都可以为 nil(可选),我们必须获取其中一个的值,或者如果两者都为 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 做到这一点?如果没有,有没有更好的方法来处理这种情况?

谢谢。

【问题讨论】:

    标签: swift coding-style optional


    【解决方案1】:

    这是 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 != nil,则计算为_account,然后计算为 self.defaultAccount 否则。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多