代码之家  ›  专栏  ›  技术社区  ›  Aleksandr Maybach

如果元素为any,如何从枚举中获取rawvalue?

  •  2
  • Aleksandr Maybach  · 技术社区  · 6 年前

    我有一个类型的变量 Any? .我完全知道那个变量是什么类型的 enum: String . 如何获得rawvalue,比如:

    var somevar: Any? = someValue
    (somevar as ?????).rawValue
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   user28434'mstep    6 年前

    假设您在导入的模块中的某个位置定义了此项:

    enum First: String {
        case a, b
    }
    
    enum Second: String {
        case c, d
    }
    

    在您的模块中,您应该这样做:

    protocol StringRawRepresentable {
        var rawValue: String { get }
    }
    
    extension First: StringRawRepresentable {}
    extension Second: StringRawRepresentable {}
    

    你的问题是:

    var somevar: Any? = someValue
    let result = (somevar as? StringRawRepresentable)?.rawValue
    

    例如,如果 someValue == Second.c 你会得到 "c" 在里面 result .

    这种方法是可行的,但你必须 extend 所有可能的类型,否则 as? 铸造将导致 nil 即使类型有 rawValue: String 属性。

        2
  •  1
  •   Prashant Tukadiya    6 年前

    首先,对不起,我误解了你的问题。

    是的,这是可能的,而且非常容易

    它是斯威夫特之美

    你得多加一步

    步骤1:

    添加协议

    protocol TestMe {
        var rawValueDesc: String {get}
    
    }
    

    步骤2:

    在枚举中实现它

     enum YourEnum:String,TestMe {
            case one = "test"
            case two = "test1"
    
            var rawValueDesc: String {
                return self.rawValue
            }
    
        }
    

    终于

        var testdd:Any = YourEnum.one
        if let finalValue =   testdd as? TestMe {
           print( finalValue.rawValueDesc)
        }
    

    希望对你有帮助