簡體   English   中英

Swift結構數組到Dictionary中拋出一個nil值

[英]Swift struct array into Dictionary throw a nil value

我有一個struct ,我需要將其轉換為字典

struct ModelFeedbackServices: Codable {
    let servicesId: String?
    let servicesName: String?
    let category: String?
}

我有一個相同類型的ModelFeedbackServices數組

private var selectedItems = [ModelFeedbackServices]()

我需要將此數組轉換為字典,將其添加到我的參數中:

var parameters: [String: Any]? {
    var params: [String: Any] = [:]
    switch self {
    case .submit(let services, let comments):
////////////////////////////////////////////////////////////////////////////////////
       params["FEEDBACK_SERVICES"] = services.asDictionary // Here it comes as nil!
////////////////////////////////////////////////////////////////////////////////////
       params["COMMENTS"] = comments
       return params
   }
}

我創建了extension Encodable

extension Encodable {

    var asDictionary: [String: Any]? {
        guard let data = try? JSONEncoder().encode(self) else { return nil }
        return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
    }
}

問題是每次我在switch語句中的services.asDictionary得到一個nil

我需要字典看起來像這樣

{
    "FEEDBACK_SERVICES": [
        {
            "SERVICE_ID": "8",
            "SERVICE_NAME": "ABC",
            "CATEGORY": "1"
        },
        {
            "SERVICE_ID": "4",
            "SERVICE_NAME": "ABC",
            "CATEGORY": "2"
        }
    ],
    "COMMENTS": "any comment"
}

任何想法都會有所幫助

能不能介紹一下這Encodable擴展得到DictionaryArrayDictionary

typealias JSON = [String:  Any]

extension Encodable {

    /// Converting object to postable JSON
    func toDictionary(_ encoder: JSONEncoder = JSONEncoder()) -> JSON {
        guard let data = try? encoder.encode(self) else { return [:] }
        guard let object = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) else { return [:] }
        guard let json = object as? JSON else { return [:] }
        return json
    }

    /// Converting object to postable array of JSON
    func toDictionaryArray(_ encoder: JSONEncoder = JSONEncoder()) -> [JSON] {
        guard let data = try? encoder.encode(self) else { return [[:]] }
        guard let object = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) else { return [[:]] }
        guard let jsonArray = object as? [JSON] else { return [[:]] }
        return jsonArray
    }
}

用法

var parameters: [String: Any]? {
    var params: [String: Any] = [:]
    switch self {
    case .submit(let services, let comments):
////////////////////////////////////////////////////////////////////////////////////
       params["FEEDBACK_SERVICES"] = services.toDictionaryArray() // Here it comes as nil!
////////////////////////////////////////////////////////////////////////////////////
       params["COMMENTS"] = comments
       return params
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM