【问题标题】:Swift using if on an enum resulting in error not convertible to '_ArrayCastKind'Swift 在枚举上使用 if 导致错误无法转换为 '_ArrayCastKind'
【发布时间】:2014-07-10 03:54:20
【问题描述】:

我正在使用 xcode 6 的 Beta 3,并且在针对传递给闭包参数的枚举执行简单的 if 语句时遇到问题。这是简单的枚举定义:

enum FLSTeslaLoginStatus {
    case LoggedOut
    case LoggedIn
    case LoggingIn
    case LoginFailed(NSData!, NSHTTPURLResponse!, NSError)
}

而出现错误的代码是:

如您所见,switch 语句工作正常,但 if 检查导致错误。这只是一些测试代码,所以我通常不会有 switch 和 if 语句,但我试图找出 if 语句有什么问题。我认为这是一个编译器错误。

在 Swift 2.0 中使用“if case”支持这一点。

【问题讨论】:

  • 看起来如果枚举的任何情况都有关联的值,您必须使用 switch-statement 来测试它。是时候提交错误报告了(至少错误消息需要有意义)。将枚举与自身进行比较时也会出现相同的错误。即t == t.
  • 奇怪的是,如果我使用快捷方式 .LoggedIn,我会收到错误,但如果它是完全限定的,则不会。
  • 这几乎可以肯定是一个错误,提交雷达。
  • 凯文,我也一样。如果完全合格,则可以正常工作。

标签: xcode swift


【解决方案1】:

Swift 2.x 通过 if case 模式匹配允许这样做:https://www.natashatherobot.com/swift-2-pattern-matching-with-if-case/

if case let .LoggedIn(name,password) = status  {
   print( "\(name) Logged in!" )
}

【讨论】:

    【解决方案2】:

    此时(iOS8 Beta 4),在进行 == 比较时,您似乎需要对枚举值进行全面质量评估。

    好的:

    if (taskSortOrder == TaskSortOrder.Name) {
        ...
    }
    

    错误: “TaskSortOrder' 不能转换为 'Selector'”

    if (taskSortOrder == .Name) {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      这也发生在我的枚举示例中,但我使用的是 Int 类型

      enum DisplayFunctionKey : Int {
           case Auto, A, B, C, D, E, F, G, H
      }
      
      var key : DisplayFunctionKey = .Auto;
      
      if key == .Auto { /* do your stuff */ } // gives error
      

      但是! ...奇怪的是,在 if 语句中使用 not 运算符并伴随 else 它可以工作:

      if key != .Auto {} else { /* do your stuff */ } // this works
      

      这有点难看,但比整个 switch 不动产只需要一个线路检查更多。

      【讨论】:

        【解决方案4】:

        你应该使用带有枚举的 switch 语句。

        switch task order {
        case .Name:
           ...
        default:
           break
        }
        

        【讨论】:

        • Switch 是访问枚举值的一种方式。例如,“if let”是访问具有关联类型的枚举值的好方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 2016-02-24
        • 1970-01-01
        • 2015-01-25
        相关资源
        最近更新 更多