我几乎是 swift 的新手,我遇到了一个运行时错误:
typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary but found an array instead.", 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: "خطا در ارتباط با سرور")
}
}
最佳答案
编码没问题,重新解码失败。
错误信息很清楚。你必须解码一个数组。
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)
关于ios - 如何使用swift将可编码结构发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52414971/