swift 我希望结果是字典,但它像属性一样被访问...为什么?

yqyhoc1h  于 2022-12-10  发布在  Swift
关注(0)|答案(2)|浏览(120)

我有一个来自服务器的JSON ...

{
  "cars": [
    {
      "name": "Ferrari",
      "price": "100"
    },
    {
      "name": "Lamborghini",
      "price": "200"
    },
    {
      "name": "Ford Pinto",
      "price": "1"
    }
  ]
}

这个JSON是一个名为cars的字典,其中包含一个汽车数组,对吗?
然后我有这个结构...

struct Cars: Codable {
    let cars: [Car]
}

struct Car: Codable, Hashable, Identifiable {
    let id = UUID()
    let name: String
    let price: String
}

我使用以下代码对JSON进行解码:

let (data, _) = try await urlSession.data(from: url)
let result = try JSONDecoder().decode(Cars.self, from: data)
let listOfCars = result.cars

这是我不明白的事情。
result.cars中,carsresult的属性,在结构Cars中声明为数组。不是字典。
我希望使用result["cars"]访问它。
为什么会这样呢?

4si2a6ki

4si2a6ki1#

在您的代码中...

let (data, _) = try await urlSession.data(from: url)
let result = try JSONDecoder().decode(Cars.self, from: data)
let listOfCars = result.cars

result是Struct Cars的一个示例。您的设置代码已经告诉Swift如何将JSON字典转换为您自己的Struct。
因此,result内部的所有内容都可以像下面这样访问...

let result = Cars(cars: [
  Car(name: "Ford", price: "£10,000")
])

print(result.cars)

唯一的区别是创建方法不同,我们使用JSON解码将一些JSON解码为自定义类型,而不是像这样使用init方法。

rdrgkggo

rdrgkggo2#

正如注解和答案中所述,它根据解码策略获取结果类型。在您的代码result type is Cars中不是dictionary。因此,您可以使用result.cars访问属性
如果你想用字典来代替,你需要像这样解码

let result = try decode.decode([String : [Car]].self, from: data)

现在您可以像使用字典一样访问它们

print(result["cars"]?.first?.name) // Optional("Ferrari")

相关问题