ios - Swift struct array into Dictionary 抛出一个 nil 值

标签 ios arrays swift

我有一个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扩展来得到Dictionary或者DictionaryArray

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

关于ios - Swift struct array into Dictionary 抛出一个 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55902497/

相关文章:

swift - 为什么我无法从此 https 请求接收值?

ios - Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?

ios - 在UITableViewCell中为detailTextLabel添加右边距

arrays - 提取数组头并保持其顺序

ios - 获取 UIBarButtonItem 当前图像名称

python - 如何使用 NumPy 从列表创建多维数组?

c - 为什么在 C 中返回给定错误的语句?

ios - 预签名 Url 分段上传始终返回 403

ios - SpriteKit 边框除底部外的所有边

ios - 协议(protocol) var {get}