繁体   English   中英

将字符串转换为枚举而没有值快速

[英]Convert string to enum without a value swift

我正在创建一个权限系统,下面的emum显示了可能的高级权限。 我从服务器以字符串形式获取许可: advance.answer.view 有什么办法可以将该字符串转换为枚举Advance.Answer.View吗?

enum Advance {

        case View, Edit

        enum Answer { case View, Edit }
        enum Ride { case View, Edit }
        enum Contact { case View, Edit }
        enum Document { case View, Edit }
        enum Guest { case View, Edit }
        enum Section { case View, Edit, Create }
        enum Member { case View, Edit }
        enum Flight { case View, Edit }
        enum Location { case View, Edit }
        enum Time { case View, Edit }
        enum Event { case View, Edit }

    }

您需要使枚举为String原始值,例如

enum Answer:String {
  case View = "View"
  case Edit = "Edit"
  init(s:String) {
    if s == "xy" { self = .View}
    else { self = .Edit }
  }
  mutating func fromString(s:String) {
    if s == "xy" { self = .View}
  }
}

var answer1 = Answer(rawValue:"View")!
var answer2 = Answer(s:"x")
answer2.fromString("xy")

您可以将视觉结构修改为:

enum Advance {
    case Answer(view: Bool, edit: Bool)
}

// usage
Advance.Answer(view: false, edit: true)

UPD。 另一种情况:

enum Advance: String {
    case View = "view", Edit = "edit"

    static func getEnumType(value: String) -> EnumProtocol.Type {
        switch value {
            case "contact":
                return Contact.self

            default:
                return Answer.self
        }
    }

    enum Answer: String, EnumProtocol {
        init(rawValue: String) {
            switch rawValue {
                case "edit":
                    self = .Edit

                default:
                    self = .View
            }
        }

        case View = "view", Edit = "edit"
    }

    enum Contact: String, EnumProtocol {
        init(rawValue: String) {
            switch rawValue {
                case "write":
                    self = .Write

                case "edit":
                    self = .Edit

                default:
                    self = .View
            }
        }

        case View = "view", Edit = "edit", Write = "write"
    }
}

您可以使用rawValue的get函数扩展EnumProtocol。

protocol EnumProtocol {
    init(rawValue: String)
}

更新于(31/01/2016)

用法:

Advance.getEnumType("contact").init(rawValue: "write") // Advance.Contact.Write
Advance.getEnumType("unknown").init(rawValue: "abc") // Advance.Answer.View

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM