【问题标题】:How I can get rawValue from enum, if element is Any?如果元素是 Any,我如何从枚举中获取 rawValue?
【发布时间】:2018-12-05 12:49:51
【问题描述】:

我有一个Any? 类型的变量。我完全知道那个变量是enum: String 的类型。我怎样才能得到 rawValue 类似的东西:

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

【问题讨论】:

  • stackoverflow.com/questions/32952248/…。看到这篇文章我希望对你有帮助
  • 如果你完全知道这个变量是一个String枚举,你为什么将它声明为Any?您正在与强类型系统作斗争。始终尽可能具体,而不是相反。

标签: ios swift enums


【解决方案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)
    }
    

希望对你有帮助

【讨论】:

    【解决方案2】:

    假设您在您的或导入的模块中的某处定义了这个:

    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 你会在result 中得到"c"

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

    【讨论】:

    • 看来这相当于this answer
    • @OOPer,协议名称确实匹配,其余只是语言功能的琐碎使用,没有链接答案那么复杂。
    • 您可以有自己的看法。但我找不到比链接答案或 Prashant Tukadiya 的答案有任何显着差异。而你的比 Prashant Tukadiya 的晚两分钟。
    • @OOPer 早前*
    • @OOPer,你的意思是什么?我抄袭的答案?时间X ago 反向工作,X 越大,发布时间越早。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多