【问题标题】:how to send codable struct to server with swift如何使用 swift 将可编码结构发送到服务器
【发布时间】:2019-02-24 03:59:20
【问题描述】:

我几乎是 swift 新手,我遇到了一个运行时错误,上面写着:

typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: "本应解码 Dictionary 但找到了一个数组。", underlyingError: nil))

我有一组数据需要发送到 API。

下面的代码显示了 API 将接受的模型

Json

 {
  "items": [
    {
      "Number": 1,
      "ID": 9827
    }

  ]
}

我的结构:

    struct Itemm : Codable {
    var unitNo:Int? 
    var personId:Int?

    enum iItem : Int ,CodingKey{
        case unitNo , personId
    }

}
struct welcome : Codable {
    var items : [Itemm?]
}
typealias welcomeList = [welcome]

下面的代码显示了我创建数组并尝试将其发送到服务器的方式

    var items = [Itemm]()
            for indexPath in self.selectedCells {
                let data = self.data![indexPath.section]
                let contact = data.contacts[indexPath.row]
                let newItem = Itemm(unitNo: data.unitNo, personId: contact?.id)
                items.append(newItem)
            }
    //      let welcome = welcome(items: items)
            print(items)
            let welcomee = welcome(items: items)
            print(welcomee)
            do{

       //I found this part on stackoverflow
            let dict = try JSONDecoder().decode([String: Int].self, from: JSONEncoder().encode(items))
                print("===============")
                print(dict)
                print("********************")
                Presenter.sendSmsForAllTheMembers(AptId: aptId, data: dict)
            }
            catch let error
            {
                print(error)
            }

我正在使用 Alamofire 和 Moya 库。 有人知道我应该如何将我的请求发送到 API 吗?

func sendSmsForAllTheMembers(AptId:String , data:[String:Any])
{
    ApiGenerator.request(targetApi: ApartemanService.sendSms(aptId: AptId, data: data), responseModel: Nil.self, success: { (response) in
        if response.response.statusCode == 200 {
            self.view?.SendingSmsSuccess()
        }else {
            do{

                var errorMessage = try response.response.mapString()
                errorMessage = errorMessage.replacingOccurrences(of: "\"", with: "",
                                                                 options: NSString.CompareOptions.literal, range:nil)
                print("errorMessage =============")
                print(errorMessage)
                self.view?.SendingSmsFailed(errorMessage: errorMessage)

            }catch let error{
                print(error)
                self.view?.SendingSmsFailed(errorMessage: "خطا در ارتباط با سرور")
            }

        }

    }) { (error) in
        self.view?.SendingSmsFailed(errorMessage: "خطا در ارتباط با سرور")
    }
    }

【问题讨论】:

  • 我对 Moya 不是很熟悉,但是乍一看,您的 var items = [Itemm]() 似乎是一个数组,而您正在使用 JSONEncoder 对其进行编码并将其作为字典。您可能希望尝试items 数组转换为字典(请参阅here)并确定这是否会产生影响。请注意,这可能会导致服务器端出现解析问题,但知道这是否能解决 Xcode 的错误会很有趣。

标签: ios arrays json swift xcode


【解决方案1】:

编码正常,但重新解码失败。

错误信息很清楚。你必须解码一个数组。

try JSONDecoder().decode([[String: Int]].self...

但由于 API 需要字典,您可以直接创建字典

var items = [[String:Int]]()
for indexPath in self.selectedCells {
    let data = self.data![indexPath.section]
    let contact = data.contacts[indexPath.row]
    items.append(["Number" : data.unitNo, "ID" : contact!.id])
}
let welcome = ["items" : items]
print(welcome)
Presenter.sendSmsForAllTheMembers(AptId: aptId, data: welcome)

【讨论】:

  • 我尝试这个时遇到错误!!无法将类型“[[String : Int]]”的值转换为预期的参数类型“[String : Any]”
  • 代码中有一些不一致的地方。 iItem 枚举无效,并且 JSON 中的键与结构成员不匹配。
  • 显示json的代码的第一部分是我不知道我的结构是否正确的问题之一!
  • 我只是在回答问题以解决 type mismatch 错误。为了解决后续的错误——正如我已经说过的——代码中有太多的不一致和缺失的信息。例如,您为什么要立即编码和解码?为什么你编码items 而不是更可能的welcomee?什么是sendSmsForAllTheMembers
  • 我用一个建议更新了答案,但我不知道它是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2015-07-19
相关资源
最近更新 更多