Skip to content

Instantly share code, notes, and snippets.

@to4iki
Last active February 13, 2018 06:49
Show Gist options
  • Save to4iki/be7c308276f312741745193ad742b5c9 to your computer and use it in GitHub Desktop.
Save to4iki/be7c308276f312741745193ad742b5c9 to your computer and use it in GitHub Desktop.
convert dictionary
import Foundation
typealias Parameters = [AnyHashable: Any]
protocol Converter {
func convert(_ input: Any) -> Any
}
struct BoolConverter: Converter {
func convert(_ input: Any) -> Any {
if let bool = input as? Bool {
return bool.description
} else {
return input
}
}
}
struct StringConverter: Converter {
func convert(_ input: Any) -> Any {
if let str = input as? String {
return str.capitalized
} else {
return input
}
}
}
protocol CompositeConverter: Converter {
/// order in which the converters are applied
var converters: [Converter] { get }
}
extension CompositeConverter {
func convert(_ input: Any) -> Any {
return converters.reduce(input) { (acc, converter) in
converter.convert(acc)
}
}
func convert(_ input: Parameters) -> Parameters {
return input.mapValues { value -> Any in convert(value) }
}
}
struct ParametersConverter: CompositeConverter {
let converters: [Converter] = [BoolConverter(), StringConverter()]
}
// MARK: - exec
let dic: Parameters = [
"string": "string",
"int": 0,
"bool": true
]
let converter = ParametersConverter()
converter.convert(dic) // ["string": "String", "int": 0, "bool": "True"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment