gpt4 book ai didi

ios - Swift:将对象转换为字典无法正常工作

转载 作者:行者123 更新时间:2023-11-28 23:21:56 26 4
gpt4 key购买 nike

我正在尝试将对象转换为具有扩展名的 NSDictionary。它工作正常,但如果对象包含一个数组,则该数组不会转换为 NSDictionary 而是转换为 Json,这不是我想要的。因为我尝试使用这个词典来发出请求,并且正文接受 [String: Any]。

我的代码:


struct Country: Codable {
let name: String
let cities: [City]

struct City: Codable {
let name: String
}
}

extension NSDictionary {

func encode<T>(_ value: T) throws -> [String: Any]? where T: Encodable {
guard let jsonData = try? JSONEncoder().encode(value) else { return nil }
return try? JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? [String: Any]
}

}

使用:

let country = Country(name: "France", cities: [Country.City(name: "Paris"), Country.City(name: "Marseille")])
print(try! NSDictionary().encode(country))

输出:

["name": France, "cities": <__NSArrayI 0x600002926e60>(
{
name: "Paris",
},
{
name: "Marseille",
})
]

预期输出(我想要的):

["name": France, "cities": [
[
"name": Paris,
],
[
"name": Marseille,
]
]
]

最佳答案

输出是正确的,因为您的结果是 NSDictionary 并且输出是 NSDictionary 的字符串表示形式(又名 description)。 <__NSArrayI 0x600002926e60> 是语法糖。

顺便说一句,预期 输出无效,因为城市名称必须用双引号引起来。

无论如何,NSDictionary 的扩展毫无意义。如果您希望能够从任何地方调用该方法,请声明一个具有静态方法的结构。

这是您的代码的更快速 版本。没有 allowFragments 并且所有错误都被抛出而不是被忽略。

struct DictionaryEncoder {
static func encode<T>(_ value: T) throws -> [String: Any] where T: Encodable {
let jsonData = try JSONEncoder().encode(value)
return try JSONSerialization.jsonObject(with: jsonData) as? [String: Any] ?? [:]
}
}

将方法和结构复制到 Playground 中并运行

let country = Country(name: "France", cities: [Country.City(name: "Paris"), Country.City(name: "Marseille")])
try! DictionaryEncoder.encode(country)

不要打印结果,看Playground中的结果区域,输出正是你想要的。

关于ios - Swift:将对象转换为字典无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com