Существует код, в котором вы можете получить метку плюс все значения перечисления.
public extension Enum {
public var associated: (label: String, value: Any?, values: Dictionary<String,Any>?) {
get {
let mirror = Mirror(reflecting: self)
if mirror.displayStyle == .enum {
if let associated = mirror.children.first {
let values = Mirror(reflecting: associated.value).children
var dict = Dictionary<String,Any>()
for i in values {
dict[i.label ?? ""] = i.value
}
return (associated.label!, associated.value, dict)
}
print("WARNING: Enum option of \(self) does not have an associated value")
return ("\(self)", nil, nil)
}
print("WARNING: You can only extend an enum with the EnumExtension")
return ("\(self)", nil, nil)
}
}
}
После этого вы сможете получить .associated.label и .associated.value изваше перечисление.В вашем случае ваше .value будет перебором.Тогда вам нужно будет использовать .associated.values.К сожалению, вы не получите имена полей для этих значений.Поскольку это набор, вы получите имена полей, такие как .0, .1 и .2.Насколько я знаю, нет способа получить действительные имена полей.
Так что в вашем случае ваш код будет выглядеть примерно так:
enum API {
case login(phone:String, password:String, deviceID:String)
}
extension API:TargetType {
var task: Task {
return .requestParameters(self.associated.values, encoding: JSONEncoding.default);
}
}
Но тогда вам все еще нужны некоторые функциидля перехода от self.associated.values, где ключи .0, .1 и .2 к именам, которые вам нравятся.Я думаю, что единственный вариант - сделать это самостоятельно.Вы можете расширить свой enum с помощью этой функции.
Если вы хотите увидеть еще несколько помощников enum, взгляните на Stuff / Enum