Swift-y布尔表达式 - if if / switch之外的情况

时间:2016-08-09 06:52:31

标签: swift optional boolean-expression

要继续下一个屏幕,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,这是不正确的,据我所知,在||if语句中无法使用guard的可选绑定。更不用说我觉得它比力展开更不清晰和可读。

任何人都有一个更明确,更Swifty的解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

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

如果patron.identifier2nil,那么patron.identifier2?.isEmpty 评估结果为nil,结果会得到false