devxoul / MoyaSugar

🍯 Syntactic sugar for Moya

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Optional parameters

dtomicAZ opened this issue · comments

  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 ?

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
  }
}

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 ?

You can refer to https://github.com/devxoul/Immutable/blob/master/Sources/FilterNil.swift but not that differ from your implementation :)

Great thank you.