#ios #swift
#iOS #swift
Вопрос:
Я хочу знать, как я могу принудительно использовать все свойства из этой структуры, чтобы иметь возможность отправлять POST-запрос в наш API?
Прежде всего. Мне нужны все эти optional
свойства, потому что я делаю запрос GET, получаю все эти документы, обрабатываю данные, добавляю file
свойство (которое является объектом), затем мне нужно отправить все эти документы обратно на наш сервер с добавленным файлом.
У нас есть наш Document
struct Document: Codable {
let allowedFormats: [String]?
let processWhereApply: [String]?
let isRequired: Bool?
let id, key, title, description: String?
var file: File?
// More properties
}
Но каждый раз происходит сбой, потому что я, например, не отправляю строку. Я отправляю Optional<String>
Возможно ли, что я могу «принудительно» отправить все эти свойства обратно? без записи 25 строк guard let var = var else { return }
?
Я отправляю запрос POST с такими параметрами
let params = [
"userId": userId,
"groupId": groupId,
"fileDocuments": documents! //sends all properties optional
] as [String: Any]
Api().saveDocuments(params: params)
Комментарии:
1. Мне нужны все эти необязательные свойства . Я сомневаюсь в этом. В основном объявляйте только те свойства как необязательные, которые могут быть
nil
. Ваша проблема выглядит как неправильное использование интерполяции строк илиString(describing)
2. @vadian Я немного обновил свой вопрос
Ответ №1:
Я предполагаю, что вы отправляете данные обратно в виде Json. В этом случае просто используйте метод Json encode для преобразования структуры в Json, который может быть отправлен как POST-запрос. Json encode решит проблему с нулевым значением, установив соответствующее значение для ключа в вашем json, если значение существует, и не создавая ключ, если он не существует.
Например, просто для получения json:
let doc1 = Document(!here you will be initialising variables!)
// below gives you json as data
let json = try! JSONEncoder().encode(doc1)
// if you want your json as string
let str = String(decoding: json, as: UTF8.self)
Вот пример выполнения запроса alamofire POST. В случае alamofire он автоматически кодирует вашу структуру, если она соответствует Codable:
let doc1 = Document(!here you will be initialising variables!)
AF.request("https://yoururl.com",method: .post,parameters: doc1, encoder: JSONParameterEncoder.default).responseJSON { response in
switch response.result {
case .success(let json):
print("good response")
break
case .failure(let error):
print("bad response"
}
}