【问题标题】:Is it possible to assign multiple values in an enumeration? Swift language是否可以在枚举中分配多个值?斯威夫特语言
【发布时间】:2022-02-03 22:55:01
【问题描述】:

我做了这样的事情:

enum DollarCountries: String { 
    case usa = "USA", //Countries Where the U.S. Dollar
    case australia = "Australia" //Countries Where the Australian Dollar        
    case canada = "Canada" //Countries Where the Canadian Dollar
}

我需要这样做:

enum DollarCountries: String { 
    case usa = "USA", "Palau", "Panama"
    case australia = "Australia", "Kiribati", "Nauru"
    case canada = "Canada"
}

我尝试这样做,但没有成功:c

enum DollarCountries: [String] {
...
}

【问题讨论】:

  • 你可以像这样在枚举中使用计算属性。 var states : [String] { ["Palau","Panama"] }

标签: swift enums associated-types


【解决方案1】:

不,枚举不能有多个原始值。但是,您可以使用这样的竞争属性

enum DollarCountries1{
    case usa(String?)
    var storedDollar : [String]  {
        ["USA","Australia","Canada"]
    }

    var moneyType : String{
        switch self {
        case .usa(let str):
            if storedDollar.contains(str!){
                return "Dollar";
            }
            return "none"
        default:
            return "none"
        }
     }

}

let country = "USA"
var forUsa = DollarCountries1.usa(country)
print(forUsa.moneyType)

【讨论】:

    【解决方案2】:

    如前所述,每个枚举情况不能有多个 rawValues,也不能有一个值数组作为 rawValue

    如何进行很大程度上取决于代码的使用方式。如果您的意图是从 String 转到您的 enum,您可以使用自定义初始化程序来促进这一点

    enum DollarCountries {
        case usa, australia, canada
    }
    
    extension DollarCountries {
    
        init?(_ rawValue: String) {
            switch rawValue {
                case "USA", "Palau", "Panama":
                    self = .usa
    
                case "Australia", "Kiribati", "Nauru":
                    self = .australia
    
                case "Canada":
                    self = .canada
    
                default:
                    return nil
            }
        }
    }
    
    let a = DollarCountries("USA")      // .usa
    let b = DollarCountries("Kiribati") // .australia
    let c = DollarCountries("UK")       // nil
    

    如果您主要想反其道而行之,那么您只需要一个计算属性:

    extension DollarCountries {
    
        var nations: [String] {
            switch self {
                case .usa:
                    return ["USA", "Palau", "Panama"]
    
                case .australia:
                    return ["Australia", "Kiribati", "Nauru"]
    
                case .canada:
                    return ["Canada"]
            }
        }
    }
    

    如果您两者都需要,我会留给您找到一种无需复制数组即可实现此功能的方法

    P.S:对于nations 计算属性,如果顺序不重要,我强烈建议您使用Set

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2021-11-11
      • 2017-05-23
      • 2017-07-22
      • 2017-03-24
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多