字典是否应该转换为Swift中的类或结构?

Mic*_*ola 7 struct dictionary class swift

我正在开发一个本机iOS应用程序,它从我们也可以控制的Web服务接收JSON格式的数据.计划是在18个月内改变后端数据库,转而采用不同的平台.

考虑到这一点,我们希望确保iOS应用程序相对容易适应新的数据源,特别是因为我们可能会更改通过JSON从服务器接收的关联数组中使用的键.

有两个目标:

  1. 为每个PHP请求创建一个位置,如果需要,可以修改密钥.这样可以避免通过代码挖掘来找到类似的东西job["jobNumber"].

  2. 清理我们现有的代码,以消除像job["jobNumber"].

我们都是Swift的新手,没有Objective-C经验,但我认为Struct或Class适合创建像job.jobNumber.

字典应该转换成类还是结构?表示采用Dictionary<String, String>如下所示的可重用方法并将其转换为推荐类型的示例代码将非常有用.

示例词典:

job = {
    "jobNumber" : "1234",
    "jobName" : "Awards Ceremony",
    "client" : "ACME Productions"
}
Run Code Online (Sandbox Code Playgroud)

期望的结果:

println("job name is \(job.name)")
// prints: job name is Awards Ceremony
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 7

要以这种方式访问​​它,您需要将字典转换为Struct,如下所示:

编辑/更新:Swift 3.x

struct Job: CustomStringConvertible {
    let number: Int
    let name, client: String
    init(dictionary: [String: Any]) {
        self.number = dictionary["jobNumber"] as? Int ?? 0
        self.name = dictionary["jobName"] as? String ?? ""
        self.client = dictionary["client"] as? String ?? ""
    }
    var description: String {
        return "Job#: " + String(number) + " - name: " + name + " - client: " + client
    }
}
Run Code Online (Sandbox Code Playgroud)
let dict: [String: Any] = ["jobNumber": 1234,
                                     "jobName"  : "Awards Ceremony",
                                     "client"   : "ACME Productions"]

let job = Job(dictionary: dict)
print(job.number)       //  1234
print(job.name)         //  "Awards Ceremony"
print(job.client)       //  "ACME Productions"
print(job)              // "Job#: 1234 - name: Awards Ceremony - client: ACME Productions"""
Run Code Online (Sandbox Code Playgroud)

编辑/更新:

Swift 4或更高版本,您可以使用JSON Codable协议:

struct Job {
    let number: Int
    let name, client: String
}
extension Job: Codable {
    init(dictionary: [String: Any]) throws {
        self = try JSONDecoder().decode(Job.self, from: JSONSerialization.data(withJSONObject: dictionary))
    }
    private enum CodingKeys: String, CodingKey {
        case number = "jobNumber", name = "jobName", client
    }
}
extension Job: CustomStringConvertible {
    var description: String {
        return "Job#: " + String(number) + " - name: " + name + " - client: " + client
    }
}
Run Code Online (Sandbox Code Playgroud)
let dict: [String: Any] = ["jobNumber": 1234,
                           "jobName"  : "Awards Ceremony",
                           "client"   : "ACME Productions"]
do {
    let job = try Job(dictionary: dict)
    print(job.number)       //  1234
    print(job.name)         //  "Awards Ceremony"
    print(job.client)       //  "ACME Productions"
    print(job)              //  "Job#: 1234 - name: Awards Ceremony - client: ACME Productions\n"
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)