Как мне преобразовать мой объект класса в JSON для Alamofire - PullRequest
0 голосов
/ 18 февраля 2019

РЕДАКТИРОВАТЬ: 19.02.2019 Я попробовал предложенные решения.Я выбрал более простой способ передачи словаря в качестве параметра и использования JSONEncoder от Alamofire, чтобы превратить его в объект JSON.Это было первое, что я попробовал, но проблема была в том, что спасибо всем за помощь.

Я хочу опубликовать объект класса в API, но я борюсь с типами и кодирую его в JSON.

let jsonData = try JSONEncoder().encode(classObject)
let params = String(data: jsonData, encoding: .utf8)

Alamofire.request(shopSubmitURL, method: .post, parameters: params).responseString { response in
            switch(response.result) {
            case .success(_) :
                if let data = response.result.value {
                    print("Successfully submitted class object: \(response.result.value)")
                }
                break

            case .failure(_):
                print(response.result.error)
                break
            }

И мой classObject настроен так:

class classObject: NSObject, Codable {
    var name : String = ""
    var items : Array = [Int]()
}

Я пытался преобразовать объект в словарь с расширением, но когда мне нужно, я должен использовать «Any» или «AnyObject», и это вызывает «не может выводить ошибки универсального параметра».

В настоящий момент я получаю сообщение об ошибке «метод дополнительного аргумента» в вызове.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

давайте посмотрим подробно:

AF.request(url: URLConvertible, method: HTTPMethod, parameters: Parameters?, encoding: ParameterEncoding, headers: HTTPHeaders?)

в источниках Alamofire вы можете видеть, что public typealias Parameters = [String: Any]

это означает, что вам нужно использовать его как

AF.request("https://somewhere.com", method: .post, parameters: ["name":"Name", "items":[1,2,3,4]], encoding: JSONEncoding.default, headers: [/*headers if need, also Map*/])
0 голосов
/ 18 февраля 2019

Как упоминал Джош, на этот вопрос уже был дан ответ.Но чтобы вам было проще, я порекомендую несколько вещей.

Во-первых, я бы порекомендовал вам использовать struct вместо класса. узнать больше

Во-вторых, вам может понадобиться простой codable объект, как показано ниже.

struct classObject: Codable {
    let name : String
    let items : [Int]

    // CodingKeys are used to map with json keys
    enum CodingKeys: String, CodingKey {
        case name = "name"
        case items = "itemsArr"
    }

}

рекомендуемая ссылка CodingKeys

...