【问题标题】:Switch testing a non optional against optional case values根据可选案例值切换测试非可选
【发布时间】:2015-08-26 18:45:40
【问题描述】:

我知道可以按照这个问题中的描述测试可选与可选:Swift: testing against optional value in switch case

但我想做的是用可选的 case 值测试一个非可选值:

    switch nonOptionalView{
    case optionalView1:
        // Do something

    case optionalView2:
        // Do something else

    }

Xcode 返回错误“可选 xxx 的值未解包” 如果我添加一个“?”在 case 语句的末尾,我得到“?模式无法匹配 'UIView' 类型的值”

【问题讨论】:

  • 你可以试试“!”而不是“?”告诉我它是否有效?
  • 不幸的是,它在展开可选值时抛出了一个意外发现的 nil
  • 然后使用“if let”对其进行测试...这将打开它,前提是它是您尝试强制转换的类并且永远不会崩溃您的应用程序,即使经过测试对象为零...如果展开的值可能为零(您最近的评论暗示),您还必须在切换之前测试可选...请尝试我已经测试过的最后一条评论,并添加一个 if (nonOptionalView == nil) {return} 在切换之前...这也可以
  • 这两种方法都可以解决你的问题
  • 谢谢 Neo,我试图避免使用 if let 语句,看起来这是不可能的。

标签: swift


【解决方案1】:

目前 Swift 标准库不支持模式匹配可选值。但是,您可以使用 if/else if 语句轻松执行您的逻辑:

if nonOptionalView === optionalView1 {
    // Do something
} else if nonOptionalView === optionalView2 {
    // Do something else
}

如果您真的希望能够对可选值进行模式匹配,可以使用operator overloading。要重载模式匹配运算符~=,请将以下代码放入您的项目中:

public func ~=<T : Equatable>(a: T?, b: T?) -> Bool {
    return a == b
}

现在您可以很好地匹配可选值:

switch nonOptionalView {
case optionalView1:
    // Do something
case optionalView2:
    // Do something else
default:
    // Handle default case
}

【讨论】:

  • 借助 Swift 的力量......感谢希尔顿先生!
【解决方案2】:

你可以看看这个解决方案https://stackoverflow.com/a/26941591/2485238

我发现代码比 if/else 解决方案更具可读性。

在你的情况下

switch nonOptionalView {
    case .Some(optionalView1):
    // Do something

    case .Some(optionalView2):
    // Do something else

    default: 
    // Handle default case
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多