Swift:如何表示类似实例的类型[[“ region”:“ Region1”,“ states”:[[“ state”:“ State1”,“ cities”:[“ City1”,“ City2”]]]]]]

问题描述

这是一个实例:

var example1 = [
    [
        "region": "Region1","states": [
            [
                "state": "State1","cities": ["City1","City2"]
            ]
        ]
    ]
]

如何表达类型,让我举一个简单的例子,例如["apple","orange","banana"],然后类型为[String],现在我想获得example1的类型。预先感谢。

解决方法

您应将嵌套类型设为:

struct Example {
    let region: String
    let states: [State]

    struct State {
        let state: String
        let cities: [String]
    }
}

所以结果将是:

let examples: [Example] = ...

不推荐

否则,您可以将其设为[[String: Any]],但是您将丢失所有嵌套类型,并且需要手动转换所有嵌套类型。

var example1: [[String: Any]] = ...
,

您显示的文字代表了一系列字典。但是字典具有不同的值类型,因此Swift可以做的最好的事情就是使类型为Any的值,因此文字的类型为[[String: Any]]。但是,要以有用的方式访问字典值,则需要进行大量转换。

这表明您不应该使用字典来存储数据。您应该编写自己的结构/类。

您还说过:

由于我具有该类型的plist,因此必须首先定义一个类型,以便在该plist文件中接收信息。

您可以使这些结构/类为Codable,然后可以使用PropertyListDecoder从属性列表中读取数据:

struct Example: Codable {
    let region: String
    let states: [State]

    struct State: Codable  {
        let state: String
        let cities: [String]
    }
}

并解码您的属性列表:

let propertyListData: Data = ... // get the data from your property list
let decoder = PropertyListDecoder()
do {
    let decoded = decoder.decode([Example].self,from: propertyListData)
    // access your data here via "decoded"
} catch {
    print(error) // error has occurred
}