Optional parameters
dtomicAZ opened this issue · comments
dtomicAZ commented
var params: Parameters? {
switch self {
case .cars(let offset, let sort): //here offset and sort are optionals
if offset != nil && sort != nil { return ["offset":offset!, "sort": sort!] }
else if offset != nil { return ["offset":offset!] }
else if sort != nil { return ["sort": sort!] }
else { return nil }
}
}
I'm trying to get this variations:
/Cars
/Cars?offset=1
/Cars?sort=price
/Cars?offset=1&sort=price
Is there any way to simplify this ?
Suyeol Jeon commented
I use Immutable to simplify that job.
var params: Parameters? {
switch self {
case .cars(let offset, let sort): //here offset and sort are optionals
return filterNil([
"offset": offset,
"sort": sort,
])
}
}
If you prefer pure-swift solution, you can do as following:
var params: Parameters? {
switch self {
case .cars(let offset, let sort): //here offset and sort are optionals
var parameters: [String: Any] = [:]
if let offset = offset {
parameters["offset"] = offset
}
if let sort = sort {
parameters["sort"] = sort
}
return URLEncoding() => parameters
}
}
dtomicAZ commented
Thank you for answer.
I end up using this:
case .cars(let offset, let sort):
return URLEncoding() => removeNilParameters(["offset": offset, "sort": sort])
func removeNilParameters(_ dict: [String: Any?]) -> [String: Any] {
var resultDict = [String: Any]()
let notNilMembers = Array(dict.keys).filter { dict[$0]! != nil }
for key in notNilMembers {
resultDict[key] = dict[key]!
}
return resultDict
}
Do you perhaps have better filterNil method ?
Suyeol Jeon commented
You can refer to https://github.com/devxoul/Immutable/blob/master/Sources/FilterNil.swift but not that differ from your implementation :)
dtomicAZ commented
Great thank you.