Swift - 如何将结构转换为字典

时间:2021-01-14 14:32:01

标签: swift dictionary struct

问题已更新

这是我的请求模型

    enum RequestHTTPMethod: String {
    case get = "GET"
    case post = "POST"
}

class RequestModel: NSObject, Codable {
    
    // MARK: Properties
    
    var path: String {
        return ""
    }
    
    var parameters: [String: Any?] {
        return [:]
    }
    
    var headers: [String: String] {
        return [
            "Content-Type": "application/json",
            "Authorization": "Bearer  Token",
        ]
    }
    
    var method: RequestHTTPMethod {
        return body.isEmpty ? RequestHTTPMethod.get : RequestHTTPMethod.post
    }
    
    var body: [String: Any?] {
        return [:]
    }
}

// MARK: - public func

extension RequestModel {
    
    func urlRequest() -> URLRequest {
        var endpoint: String = Constant.ServiceConstant.baseURL.appending(path)
        
        for parameter in parameters {
            if let value = parameter.value as? String {
                endpoint.append("?\(parameter.key)=\(value)")
            }
        }
        
        var request: URLRequest = URLRequest(url: URL(string: endpoint)!)
        
        request.httpMethod = method.rawValue
        
        for header in headers {
            request.addValue(header.value, forHTTPHeaderField: header.key)
        }
        
        if method == RequestHTTPMethod.post {
            do {
                request.httpBody = try JSONSerialization.data(withJSONObject: body, options: JSONSerialization.WritingOptions.prettyPrinted)
            } catch let error {
                // TODO: Handle Error
                print("error = \(error.localizedDescription)")
            }
        }
        return request
    }
}

这是我的 createPersonRequestModel

class CreatepersonRequestModel: RequestModel { 

let person = Person(name: "User", age: 23, Hobby: Hobby(name: "football", place: "Stadium"))


override var path: String {
        return Constant.ServiceConstant.createPerson
    }

override var body: [String : Any?] { 
   PersonToBody()
}

    func PersonToBody() -> [String: Any] { 
    
            let encoder = JSONEncoder()
            encoder.outputFormatting = .prettyPrinted
            encoder.dateEncodingStrategy = .iso8601
    
            guard let insectData = try? encoder.encode(person),
                  let jsonString = String(data: insectData, encoding: .utf8) else { return [:] }
    
            if let data = jsonString.data(using: .utf8) {
                do {
                    guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any] else { return [:] }
                    return json
                } catch {
                    print("Something went wrong :(")
                }
            }
            return [:]
    }

我有一个 Person 结构

    struct Person: Codable {
    var name: String
    var age: Int
    var hobby: Hobby
}

struct Hobby: Codable {
    var name: String
    var place: String
}

和转换产生的代码 ->

   ["hobby": Optional({
    name = football;
    place = Stadium;
    }), "age": Optional(23),
     "name": Optional(User)]

我将 createPersonRequestModel 文件中的 person 对象转换为 [String: Any] 类型并将其放入我从 RequstModel 接收的正文中并覆盖,但由于正文中的数据,我发送的请求失败。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你需要

do {
     let encoder = JSONEncoder()
     encoder.outputFormatting = .prettyPrinted
     encoder.dateEncodingStrategy = .iso8601
     request.httpBody = try encoder.encode(person)  
}
catch {
  print(error)
}