Я пытаюсь вызвать API, в котором я пытаюсь отправить некоторые параметры и массив изображений, но когда я нажимаю на API, я получаю сообщение об ошибке Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber dataUsingEncoding:]: unrecognized selector sent to instance 0xfb47bab3e1e91166'
. Я проверил через точку останова, он падает с параметрами, я не понимаю, почему он дает эту ошибку, мой код для API таков,
func addAPI()
{
let headers: HTTPHeaders = [
/* "Authorization": "your_access_token", in case you need authorization header */
"Content-type": "multipart/form-data"
]
let parameters :[String: Any] = ["name":productNameTxt.text!,
"price":priceTxt.text!,
"size": sizeTxt.text!,
"weight":weightTxt.text!,
"quality":qualityTxt.text!,
"brand":brandTxt.text!,
"shippingCost":shippingCostTxt.text!,
"details":detailTxt.text!,
"material_id":materialId,
"material_type_id": subMaterialId,
"maxQuantity":4]
Alamofire.upload(multipartFormData: { multipartFormData in
for (key, value) in parameters {
if let data = ((value) as AnyObject).data(using: String.Encoding.utf8.rawValue) {
multipartFormData.append(data, withName: key)
}
}
for (index, image) in self.imageArray.enumerated() {
multipartFormData.append(image.pngData()!, withName: "file", fileName: "image\(index).png", mimeType: "image/png")
}
// для i в 0..
},
to: addProductUrl,method:HTTPMethod.post,
headers:headers, encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload
.validate()
.responseJSON { response in
switch response.result {
case .success(let value):
// compBlock(value as AnyObject,true)
print("responseObject: \(value)")
case .failure(let responseError):
print("responseError: \(responseError)")
}
}
case .failure(let encodingError):
print("encodingError: \(encodingError)")
let errorDesc = (encodingError as NSError).localizedDescription
//failure(errorDesc as NSString,false)
}
})
}
Для чего эта ошибка и как ее убрать?
((value) as AnyObject).data(using: String.Encoding.utf8.rawValue)
. Вы предполагаете, что все value
могут вызывать метод .data(using:)
, который является методом String
. Но у вас есть хотя бы "maxQuantity":4]
, и ясно, что «4» — это не строка. Это Int (и в Objective-C, чтобы его так называли, это NSNumber).
у меня есть int и строка обоих значений в параметре, как я могу отправить их оба? @Ларме
все та же проблема. @БенРокки
Отсюда
if let data = ((value) as AnyObject).data(using: String.Encoding.utf8.rawValue) {
тогда любое переданное значение должно быть преобразовано в Данные, и, поскольку вы указываете целое число ( NSNumber
при заключении в json), отсюда и сбой, поэтому измените 4 на "4" и
"material_id":"\(materialId)",
@JunaidKhan тоже material_id":materialId
но я должен отправить materialId в типе данных int на серверную часть. @Sh_Khan
вы не можете отправить это так, попробуйте и посмотрите
Будет лучше, если вы выполните следующее:
//[String:String] instead of [String : Any]
let parameters :[String: String] = ["name":productNameTxt.text!,
"price":priceTxt.text!,
"size": sizeTxt.text!,
"weight":weightTxt.text!,
"quality":qualityTxt.text!,
"brand":brandTxt.text!,
"shippingCost":shippingCostTxt.text!,
"details":detailTxt.text!,
"material_id":"\(materialId)",
"material_type_id": subMaterialId,
"maxQuantity":4]
multipartFormData.append((value.data(using: .utf8))!, withName: key)
попробуйте "maxQuantity":"4"