Как я мог «принудительно» использовать все свойства в структуре? Чтобы иметь возможность отправлять их в API?

#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"
        }
    }