Last active
February 13, 2018 06:49
-
-
Save to4iki/be7c308276f312741745193ad742b5c9 to your computer and use it in GitHub Desktop.
convert dictionary
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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