gonsolo
(Andreas Wendleder)
1
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()