【问题标题】:How to unwrapping an optional while pattern matching in Swift?如何在 Swift 中进行模式匹配时解包可选?
【发布时间】:2017-01-09 10:12:55
【问题描述】:

UIAlertView 有两个变量,但只有一个是可选的。比方说

lazy var a: UIAlertView = {

    return UIAlertView() // Which is not important here
}()

var b: UIAlertView?

和委托方法

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) {

    switch (alertView, buttonIndex) {

    case (a, 0): // Do something
    case (a, 1): // Do something 
    case (b, 1): // <== Want to do something here but, b is optional.
    default: break
    }
}

模式匹配时如何解开b

注意:问题是关于 Swift language 而不是 UIAlertView

有什么帮助吗?

【问题讨论】:

  • @MartinR 不,我的问题与您提到的问题完全相反。
  • 我不这么认为。 question 是如何将非可选的someValue 与可选的someOptional 匹配,这正是您要问的。接受的答案中的第一个建议是相反的,但第二个建议 case let val where val == someOptional: 也适用于您的情况(并且类似于 Callam 下面的建议)。
  • @MartinR 好的,那么您能否将case let val where val == someOptional:与@Callam 的建议结合起来。

标签: swift switch-statement pattern-matching optional


【解决方案1】:

您可以使用 where 子句来检查 alertView 是否等于 b

case (_, 1) where alertView == b:

为确保 alertView 未包装为 nil,只需将下划线替换为 .some

case (.Some, 1) where alertView == b:

或者类似地你可以让展开的alertView,但这本质上和上面的一样。

case (let .Some(_alertView), 1) where _alertView == b:

【讨论】:

  • 它可以工作,但我并不满意。让我等一会儿,把它作为一个正确的答案。在那之前投赞成票。谢谢。
  • @Goppinath 感谢您的支持。到底是什么困扰着你?
【解决方案2】:

你可以试试这个(在这种情况下使用?) 您需要将 self.b 添加到要打开的元组中:

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) {
    switch (b, alertView, buttonIndex) {
    case (_, a, 0), (_,a,1): // Do something
    case (b?, a, 1): //  <==  b is not optional here (only matches case .Some = b and binds to local variable `b`
    default: break
    }
}

【讨论】:

  • 我也试过了,但是没用。可能是因为我还在使用 Swift 2.2?
  • 已更新,如果无法编译请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多