Default value for Enum in Swift

前端 未结 11 1855
南旧
南旧 2020-12-31 07:30

I have an enum :

public enum PersonType:String {

 case Cool                       = \"cool\"
 case Nice                       = \"rude\"
 case          


        
相关标签:
11条回答
  • 2020-12-31 07:47

    Try this approach.

    public enum PersonType:String {
    
        case Cool                       = "cool"
        case Nice                       = "rude"
        case SoLazy                     = "so-lazy"
    
        static let allKeys = [Cool.rawValue, Nice.rawValue, SoLazy.rawValue]
    }
    
    extension PersonType
    {
        func description(personTypeKey : String) -> String {
    
            if PersonType.allKeys.contains(personTypeKey)
            {
                switch self {
                case .Cool:
                    return "Cool person"
                case .Nice:
                    return "Nice person"
                case .SoLazy:
                    return "its so lazy person"
                }
            }
            else
            {
                return "YourTextHere"
            }
        }
    
        func typeImage(personTypeKey : String) -> String {
    
            if PersonType.allKeys.contains(personTypeKey)
            {
                switch self {
                case .Cool:
                    return "cool.png"
                case .Nice:
                    return "img_nice.png"
                case .SoLazy:
                    return "lazy.png"
                }
            }
            else
            {
                return "YourImageHere"
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-31 07:47

    I wonder if dictionary is not a better fit than enum here:

    let dict = [
        "Cool": "cool",
        "Nice": "rude",
        "SoLazy": "so-lazy"
    ]
    
    let personType = "unknown"
    let personDescription = dict[personType] ?? "Unknown"
    

    Less typing, faster processing, more natural handling of the default case, easier to expand.

    0 讨论(0)
  • 2020-12-31 07:48

    Another approach that works in Swift 3 (maybe 2, don't know):

    enum PersonType: String {
        case cool = "cool"
        case nice = "nice"
        case soLazy = "so-lazy"
        case other
    }
    
    let person = PersonType(rawValue: "funny") ?? .other
    

    The person variable is of type PersonType.other in this case.

    The downside to this is that you don't know the raw string value of the .other case.

    0 讨论(0)
  • 2020-12-31 07:50

    For you case:

    Default Value of Enum: I just add an default computed property, Or include an customize init.

    public enum PersonType:String {
    
        case Cool                       = "cool"
        case Nice                       = "rude"
        case SoLazy                     = "so-lazy"
    
        /// add a `default` computer property
        public static var `default`: PersonType {
            return .SoLazy
        }
    
        /// add an customize init function 
        public init(person: String? = nil) {
            if let person = person {
                switch person {
                case "cool": self = .Cool
                case "rude": self = .Nice
                case "so-lazy": self = .SoLazy
                default: self = .SoLazy
                }
            } else {
                self = .SoLazy
            }
        }
    
        public var description: String {
            switch self {
            case .Cool:
                return "Cool person"
            case .Nice:
                return "Nice person"
            case .SoLazy:
                return "its so lazy person"
            }
        }
    
        public var typeImage: String {
            switch self {
            case .Cool:
                return "cool.png"
            case .Nice:
                return "img_nice.png"
            case .SoLazy:
                return "lazy.png"
            }
        }
    
    }
    

    To use:

    if let personType = PersonType(rawValue:personTypeKey ?? "") {
        self.personType = personType
    } else {
        self.personType = PersonType.default
    }
    

    Or

    if let personType = PersonType(rawValue:personTypeKey ?? "") {
        self.personType = personType
    } else {
        self.personType = PersonType()
    }
    

    Default Value of Enum With Associated Value:

    public enum Gender {
        case man
        case woman
    }
    
    public enum PersonType {
    
        case cool(Gender)
        case nice(Gender)
        case soLazy(Gender)
    
        public static var `default`: PersonType {
            return PersonType.make.soLazy()
        }
    
        public enum Builder {
            public static func cool() -> PersonType {
                return PersonType.cool(.woman)
            }
            public static func nice() -> PersonType {
                return PersonType.nice(.woman)
            }
            public static func soLazy() -> PersonType {
                return PersonType.soLazy(.woman)
            }
        }
    
        public static var make: PersonType.Builder.Type {
            return PersonType.Builder.self
        }
    
    
        public var description: String {
            switch self {
            case .cool(let gender):
                switch gender {
                case .man: return "Cool boy"
                case .woman: return "Cool girl"
                }
            case .nice(let gender):
                switch gender {
                case .man: return "Nice boy"
                case .woman: return "Nice girl"
                }
            case .soLazy(let gender):
                switch gender {
                case .man: return "its so lazy boy"
                case .woman: return "its so lazy girl"
                }
            }
        }
    
        public var typeImage: String {
            switch self {
            case .cool(_):
                return "cool.png"
            case .nice(_):
                return "img_nice.png"
            case .soLazy(_):
                return "lazy.png"
            }
        }
    
    }
    

    To use:

    let onePersonType = PersonType.default
    let anotherPersonType = PersonType.make.soLazy()
    

    The second case solution I was found on Ilya Puchka' blog. And also it's mentioned in swift's proposal.

    0 讨论(0)
  • 2020-12-31 07:54

    Drop the raw type, and use enum with associated value:

    public enum PersonType {
        case Cool
        case Nice
        case SoLazy
        case Unknown(String)
        static func parse(s:String) -> PersonType {
            switch s {
                case "Cool" : return .Cool
                case "Nice" : return .Nice
                case "SoLazy" : return .SoLazy
                default: return Unknown(s)
            }
        }
    }
    

    The downside to dropping the raw type is that you must provide some logic for parsing the known enum values. The upside, however, is that you can fit anything else into a single Unknown case, while keeping the actual "unknown" value available for later use.

    0 讨论(0)
提交回复
热议问题