Swift-y 布尔表达式 - 大小写 if/switch

Swift-y boolean expression - case outside if/switch

要继续到下一个屏幕,patron 必须具有两个标识符之一。我必须执行此操作的代码是:

let identifier1Entered = !patron.identifier1.isEmpty
let identifier2Entered = patron.identifier2 != nil && !patron.identifier2!.isEmpty
guard identifier1Entered || identifier2Entered else { return }

但这不是 Swifty,我正在强制展开可选的 identifier2,因为我不想将其扩展到更长的时间,IMO 更混乱

var identifier2Entered = false
if let identifier2 = patron.identifier2 where !identifier2.isEmpty {
  identifier2Entered = true
}

我认为可能有用的只是从 if 语句中取出表达式,例如:

let id2Entered = let identifier2 = patron.identifier2 where !identifier2.isEmpty

let id2Entered = case .Some(let id2) = patron.identifier2 where !id2.isEmpty

但这些表达式似乎只允许在 if 语句中使用。 我想到的另一个更 Swifty 的解决方案是:

let identifier1Entered = !patron.identifier1.isEmpty
guard let id2 = patron.identifier2 where !id2.isEmpty || identifier1Entered
  else { return }

但它要求 identifier2 不为 nil,这是不正确的,据我所知,没有办法在 ifguard 中使用 || 的可选绑定声明。更不用说我觉得它不如强制展开更清晰和可读。

有人有更清晰、更 Swifty 的解决方案吗?

使用可选链接的两种可能的解决方案:

let identifier2Entered = patron.identifier2?.isEmpty == false
let identifier2Entered = !(patron.identifier2?.isEmpty ?? true)

如果 patron.identifier2nil 那么 patron.identifier2?.isEmpty 计算结果为 nil,结果是 false