У меня есть некоторые значения перечисления, которые я хотел бы привести к типу JSONDecoder Decodable.Protocol, который можно использовать в методе decode
.
Каждый из перечислений атрибутов соответствует классу Codable
.
enum Attributes : String {
case Shapes = "GetShapes"
case Color = "GetColors"
case Size = "GetSizes"
}
Вместо того чтобы иметь кучу операторов switch, я подумал, что могу динамически привести enum к правильному протоколу и сэкономить много кода.
Например,
let results = try? JSONDecoder().decode(GetShapes.self, from: jsonData)
Обратите внимание, что GetShapes.self
соответствует значению Attributes enum.
Поэтому я попытался использовать NSProtocolFromString
, но это не похоже насделай трюк.
if let protoRef = NSProtocolFromString(anAttribute.rawValue) {
if let results = try? JSONDecoder().decode(protoRef, from: jsonData) {
//Do something
}
Возможность привести строку к протоколу сэкономит мне много работы.
Надеюсь, это прояснит:
В основном, возьмите строку "GetShapes", используйте немного MagicMethod (), чтобы он выплевывал
GetShapes.self
, который удовлетворяет параметру type параметра JSONDecoder().decode(type: Decodable.Protocol, from: Data)
Некоторый метод, подобный этому:
func magicMethod(_ string: String) -> Decodable.Protocol {
}
Возможно ли этосо Swift 4?