【问题标题】:Swift ENUM how to convert "rawValue" back to Enum case?Swift ENUM 如何将“rawValue”转换回 Enum 大小写?
【发布时间】:2018-09-05 12:04:27
【问题描述】:

我有一个枚举:

  enum  switch : String {
      case on = "powerOn"
      case off = "powerOff"
      var japanswitch : String {
          case .on : return "onpu"
          case .off : return "offu"
      }
  }

在我的代码中,我的函数将“powerOn”作为纯字符串参数传递。问题是我的某些功能需要将“powerOn”转换为 japanswitch。

但问题是“powerOn”现在只不过是一个与 japanswitch 根本没有关系的字符串。

如何将“powerOn”翻译成japanswitch?期望的结果应该是“onpu”。

【问题讨论】:

    标签: swift enums


    【解决方案1】:

    首先你需要修复你的代码以便它编译:

    enum  Switch : String {
        case on = "powerOn"
        case off = "powerOff"
        var japanswitch : String {
            switch self {
            case .on : return "onpu"
            case .off : return "offu"
            }
        }
    }
    

    那么你使用后就可以达到你的目的了:

    let japanese = Switch(rawValue:"powerOn")?.japanswitch
    

    请注意,japanese 将是可选的;您需要决定如何处理无效的原始值。

    【讨论】:

      【解决方案2】:

      关键字'switch'不能用作标识符,因此您需要添加一些其他关键字,如下所示:

            enum  SwitchType : String {
                  case on = "powerOn"
                  case off = "powerOff"
                  var japanswitch : String {
                      switch self {
                      case .on : return "onpu"
                      case .off : return "offu"
                      }
                  }
              }
      

      【讨论】:

        【解决方案3】:

        试试这个

        enum  ABC : String {
              case on = "powerOn"
              case off = "powerOff"
              var japanswitch : String {
               return self == .on ? "onpu" : "offu"
              }
          }
        
          var a = ABC(rawValue: "powerOn")
          print(a!.japanswitch)
        

        【讨论】:

          【解决方案4】:

          您的问题不是很清楚,如果您向我们展示您尝试使用此枚举运行的代码会有所帮助,但我认为您可以这样做:

          import Foundation 
          
          enum SwitchType: String {
              case on = "powerOn"
              case off = "powerOff"
          
              var japaneseRepresentation : String {
                  switch (self){
                      case Toggle.on : return "onpu"
                      case Toggle.off : return "offu"
                      default: return Toggle.on.japaneseRepresentation
                  }
              }
          
              init(japanString japanString: String) {
                  switch(japanString) {
                      case "onpu": self = Toggle.on
                      case "offu": self = Toggle.off
                      default: self = Toggle.on
                  }
              }
          
          }
          
          let a = Toggle(rawValue: "powerOn")
          print(a)
          let b = Toggle(japanString: "onpu")
          print(b)
          print(a == b)
          

          这样做的好处是您可以使用自定义初始化程序来使用相同的枚举,但可以从日语字符串初始化它。

          【讨论】:

            【解决方案5】:
            enum Switch : String {
            case on = "powerOn"
            case off = "powerOff"
            
            var japanswitch : String {
                switch self {
                case .on:
                    return "onpu"
                case .off:
                    return "offu"
                }
            }}
            

            你不能使用没有 switch 语句的 case。所以可以试试上面的sn -p。如上所述定义枚举后,根据Apple官方文档,您可以将字符串值转换为枚举,如下所示。

            如果您使用原始值类型定义枚举,则该枚举 自动接收一个初始化器,它采用原始值 值的类型(作为一个名为 rawValue 的参数)并返回 枚举 case 或 nil。您可以使用此初始化程序尝试创建 枚举的新实例。

            此示例从Switch 的原始值"powerOn" 中识别japanswitch

            let japanswitchValue = Switch(rawValue: "powerOn")?.japanswitch
            

            【讨论】:

              【解决方案6】:

              完全不同的解决方案,如果您只是使用枚举进行翻译,那么您可以将其替换为字典

              let japaneseTranslation = ["powerOn": "onpu", "powerOff": "offu"]
              ...
              let offJapanese = japaneseTranslation["powerOff"]
              

              【讨论】:

                猜你喜欢
                • 2022-11-25
                • 1970-01-01
                • 1970-01-01
                • 2011-07-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多