I'm trying to support parameter lists with different types. I came up with the following code and have a few questions:
- How to get rid of the separate intParameters and stringParameters lists in ParameterList?
- How to do this more elegantly in Swift? I tried enums (as a parameter variant, generics, protocols) and always ran into problems.
enum ParameterError: Error {
case laber
}class Parameter {
init(name: String) {
self.name = name
}var name: String
}
class IntParameter: Parameter {
init(name: String, value: [Int]) {
self.value = value
super.init(name: name)
}var value: [Int]
}
class StringParameter: Parameter {
init(name: String, value: [String]) {
self.value = value
super.init(name: name)
}var value: [String]
}
class ParameterList {
init() { intParameters = [] stringParameters = [] } func add(_ parameter: IntParameter) { intParameters.append(parameter) } func add(_ parameter: StringParameter) { stringParameters.append(parameter) } func find(name: String) throws ->[Int] { for parameter in intParameters { if parameter.name == name { return parameter.value } } throw ParameterError.laber } func find(name: String) throws -> [String] { for parameter in stringParameters { if parameter.name == name { return parameter.value } } throw ParameterError.laber } var intParameters: [IntParameter] var stringParameters: [StringParameter]
}
func earlier() -> ParameterList {
let list = ParameterList()
let parameter1 = IntParameter(name: "bla", value: [13, 17])
list.add(parameter1)
let parameter2 = StringParameter(name: "laber", value: ["hurz", "schwurz"])
list.add(parameter2)
return list
}func later(_ list: ParameterList) throws {
let ints: [Int] = try list.find(name: "bla")
let strings: [String] = try list.find(name: "laber")
print(ints[0], strings[0])
}func main() throws {
let list = earlier()
try later(list)
}try main()