【问题标题】:Conditionally-compiled case statement in swiftswift中条件编译的case语句
【发布时间】:2015-03-18 03:43:41
【问题描述】:

我已经在 Swift 中实现了一个带有计算属性的枚举语句。我想添加有条件编译的值,例如仅适用于某些配置。

这是我正在尝试做的一个示例:

enum Rows: Int
{
    case Row1
    case Row2
    #if DEBUG
    case Debug
    #endif

    var rowTitle: String
    {
        case Row1: return "Row 1"
        case Row2: return "Row 2"
        #if DEBUG
        case Debug: return "Debug"
        #endif
    }
}

这似乎不受支持,因为我在 switch 语句中的 case 语句中收到以下错误消息:

“case”标签只能出现在“switch”语句中

有没有办法在 Swift 中做到这一点?

谢谢,
大卫

【问题讨论】:

    标签: swift conditional-compilation


    【解决方案1】:

    这是 Swift 中的 known bug。目前无法在 switch 内进行条件编译。

    【讨论】:

      【解决方案2】:

      枚举案例的条件编译现在可以从 Swift 4 开始使用。

      enum Foo {
          case bar
      
          #if DEBUG
          case baz
          #endif
      }
      
      let bar = Foo.bar
      
      #if DEBUG
      let baz = Foo.baz
      #endif
      

      【讨论】:

        【解决方案3】:

        您的条件编译语法看起来是正确的。但是,当我将您的代码粘贴到操场上时,会出现多个错误。第一个在以var rowTitle 开头的行,错误是“Enums may not contain stored properties”。

        【讨论】:

        • 对不起,等号不应该在那里。语法现在应该是正确的。
        • 是的,所以现在的问题是您在属性定义中使用case,而不是在switch 语句中。你不能那样做。问题不在于条件编译。
        • 我很困惑。属性定义中的case 是怎样的? #if DEBUG 实际上是闭包声明的一种形式吗?
        【解决方案4】:

        这是您的代码版本,它在语法上对于计算变量 rowTitle 的实现是正确的:

        enum Rows: Int
        {
            case Row1
            case Row2
        
            var rowTitle: String {
                    switch self {
                    case Row1:
                        return "Row 1"
                    case Row2:
                        return "Row 2"
                }
            }
        }
        

        说,这可能是您在问题中的意思......但不起作用:

        enum Rows: Int
        {
            case Row1
            case Row2
            #if DEBUG
            case Debug
            #endif
        
            var rowTitle: String {
                switch self {
                case Row1:
                    return "Row 1"
                case Row2:
                    return "Row 2"
                }
                #if DEBUG
                    switch self {
                    case Debug:
                    return "Debug"
                    default:
                    break
                    }
                #endif
            }
        }
        

        编译器不会给您任何错误,但您将无法使用Debug 的情况。

        【讨论】:

        • 如果我不想要任何有条件编译的案例,您给出的第一个示例是正确的。第二个示例无法编译,因为第一个开关并不详尽。另外,我想避免默认情况,因为如果我添加新情况但忘记在 switch 语句中处理它,我希望编译器给我一个错误。
        猜你喜欢
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        相关资源
        最近更新 更多