使用Alamofire发送参数的“Null”值

时间:2016-10-13 20:13:50

标签: swift nsdictionary swift3 alamofire nsnull

我已更新到Swift3和最新的Alamofire&#39;〜&gt; 4.0&#39; 当我尝试创建参数时,我现在得到<null>而不是null来设置我没有设置的设置。哪个与我的后端发生冲突。

有没有办法发送null

当我将值设置为nil时,它不会包含在put字典中。但我需要发回所有价值。

我的代码

func saveOfficeHours(days: [OfficeHours]) {
  guard let URL = LocationInfo.shared.url else {
    assertionFailure("location URL is nil")
    return
    }

  let formatter = DateFormatter()
  formatter.dateFormat = "HH:mm:ss"

  func formatTime(time: Date?) -> Any {
      guard let time = time else { return NSNull() }
      return formatter.string(from: time)
  }

  var parameters: [String: Any] = [:]
  for week in days {
    parameters["\(week.day)_hours_start"] = formatTime(time: week.hoursStart)
    parameters["\(week.day)_hours_stop"] =  formatTime(time: week.hoursEnd)
    parameters["\(week.day)_lunch_hours_start"] =  formatTime(time: week.lunchStart)
    parameters["\(week.day)_lunch_hours_stop"] =  formatTime(time: week.lunchEnd)
    parameters["\(week.day)_break_hours_start"] =  formatTime(time: week.breakStart)
    parameters["\(week.day)_break_hours_stop"] =  formatTime(time: week.breakEnd)
  }

  Alamofire.request(URL, method: .put, parameters: parameters, encoding: URLEncoding.httpBody, headers: API.workstationTokenAuthHeaders()).validate().responseJSON {
    response in
    switch response.result {
    case .success:
        print("Success setting office hours")
    case .failure(let error):
        print("Failure setting office hours: \n \n -------==========-------- \n \n\(error)\n \n -------==========-------- \n")
    }
  }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不会通过Alamofire与通过HTTP发送的数据之间的各种抽象正确地依赖NSNull映射,而是执行以下操作:

func formatTime(time: Date?) -> String? {
  guard let time = time else { return nil }
  return formatter.string(from: time)
}

var parameters: [String: Any] = [:]
  for week in days {
    if let hoursStart = formatTime(time: week.hoursStart) { parameters["\(week.day)_hours_start"] = hoursStart } 
    if let hoursEnd = formatTime(time: week.hoursEnd) { parameters["\(week.day)_hours_stop"] = hoursEnd } 
    if let lunchStart = formatTime(time: week.lunchStart) { parameters["\(week.day)_lunch_hours_start"] =  lunchStart } 
    if let lunchStop = formatTime(time: week.lunchEnd) { parameters["\(week.day)_lunch_hours_stop"] = lunchStop } 
    if let breakStart = formatTime(time: week.breakStart) { parameters["\(week.day)_break_hours_start"] = breakHoursStart } 
    if let breakEnd = formatTime(time: week.breakEnd) { parameters["\(week.day)_break_hours_stop"] = breakEnd }  
  }

顺便说一下,您的问题应该说明<null>null的确切位置?在Cocoa的某些日志调用中,还是在服务器端?尽管如此,更安全(并且可以说是Swiftier,因为formatTime在上面的例子中有一个有意义的返回类型)选项将高于IMO。