Swift ENUM 如何将“rawValue”转换回 Enum 大小写?

Posted

技术标签:

【中文标题】Swift ENUM 如何将“rawValue”转换回 Enum 大小写?【英文标题】:Swift ENUM how to convert "rawValue" back to Enum case? 【发布时间】: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”。

【问题讨论】:

【参考方案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"]

【讨论】:

以上是关于Swift ENUM 如何将“rawValue”转换回 Enum 大小写?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ObjectMapper 将枚举的 rawValue 分配给变量?

swift Enumerations

从匹配类型的字符串中获取 Swift 枚举类型,而不是 rawValue

使用Swift枚举作为视图标记号而不使用rawValue

phasset 子类型 rawValue 意味着 swift

如何在 Swift / Alamofire 中使用 multipartFormData?