函数枚举参数类型

Function enum parameter type

我是 swift 的新手。我有 2+ 个枚举,我想为对象生成器函数创建枚举。我找不到我应该为我的函数中的 Enum 参数使用什么类型。

我的枚举;

public enum Animal: String, CaseIterable {
  case DOG = "dog"
  case CAT = "cat"
  case BIRD = "bird"
}

public enum Car: String, CaseIterable {
  case BMW = "bmw"
  case AUDI = "audi"
}

我的函数;

  func enumToObj(Enum:TYPE?) -> Dictionary <String, String> {
    var enumsObject: [String:String] = [:];

    for enumData in Enum.allCases {
        let value = enumData.rawValue;
        enumsObject[value] = value;
    }

    return enumsObject;
  }

 //my expectation
 enumToObj(Animal) && enumToObj(Car)

您可以定义一个通用函数,它将 type 作为参数,即 CaseIterableRawRepresentable:

func enumToObj<T>(_ Enum:T.Type) -> [String: T.RawValue]
    where T: CaseIterable & RawRepresentable
{
    var enumsObject: [String: T.RawValue] = [:];
    
    for enumData in Enum.allCases {
        let value = enumData.rawValue;
        enumsObject["\(enumData)"] = value;
    }
    
    return enumsObject;
}


print(enumToObj(Animal.self))
// ["CAT": "cat", "DOG": "dog", "BIRD": "bird"]

print(enumToObj(Car.self))
// ["AUDI": "audi", "BMW": "bmw"]

使用reduce(into:_:)这也可以写成

func enumToObj<T>(_ Enum:T.Type) -> [String: T.RawValue]
    where T: CaseIterable & RawRepresentable
{
    return Enum.allCases.reduce(into: [:]) { (enumsObject, enumData) in
        let value = enumData.rawValue;
        enumsObject["\(enumData)"] = value;
    }
}