[英]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
擴展得到Dictionary
或Array
的Dictionary
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.