gpt4 book ai didi

swift - .decode 在 swift 4 中返回什么?

转载 作者:行者123 更新时间:2023-11-28 15:00:46 24 4
gpt4 key购买 nike

当您调用.decode() 来解码一个结构时,它到底返回什么?我已经在 Apple 文档中查找了它,但它只说“将 native 格式转换为内存中的表示形式”。但是,这是什么意思?谁能帮帮我?

我问这个是因为当我从这行代码的 JSON 数据中获取空值时,我的应用程序崩溃了:

let plantData = try decoder.decode([Plants].self, from: data)

这是我的结构:

struct Plants: Codable {

let date: String
let monthlyAVG: String?

enum CodingKeys : String, CodingKey {

case date = "Date"
case monthlyAVG = "30_Day_MA_MMBTU"
}
}

这是我的解析代码:

func parseJson() {
let url = URL(string: ebr_String)

// Load the URL
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
// If there are any errors don't try to parse it, show the error
guard let data = data, error == nil else { print(error!); return }

let decoder = JSONDecoder()
do{
let plantData = try decoder.decode([Plants].self, from: data)
print(plantData)

这只是我返回的信息的一小部分:

MorrowTabbedApp.Plants(date: "2018-02-22", monthlyAVG: Optional("1210.06")), MorrowTabbedApp.Plants(date: "2018-02-23", monthlyAVG: nil)]

这是来自网络的 JSON 片段:

[
{"Date":"2018-02-21","30_Day_MA_MMBTU":"1210.06"},
{"Date":"2018-02-22","30_Day_MA_MMBTU":"1210.06"},
{"Date":"2018-02-23","30_Day_MA_MMBTU":null}
]

最佳答案

decode JSONDecoder的方法|是一种“通用”方法。它返回您在该方法的第一个参数中指定的任何类型的实例。在您的情况下,它返回 [Plants] ,即 Array<Plants> ,即 Plants 的 Swift 数组实例。

如果它因为 null 而崩溃JSON 中的值,那么您必须确定什么是 null,它是否适合为 null,如果适合,请确保任何 Plants与可能为 null 的值关联的属性应该是可选的。


根据您更新后的代码片段答案,我建议:

// Personally, I'd call this `Plant` as it appears to represent a single instance

struct Plant: Codable {
let date: String
let monthlyAVG: String? // Or you can use `String!` if you don't want to manually unwrap this every time you use it

enum CodingKeys : String, CodingKey {
case date = "Date"
case monthlyAVG = "30_Day_MA_MMBTU"
}
}

和:

do {
let plantData = try JSONDecoder().decode([Plant].self, from: data)
.filter { $0.monthlyAVG != nil }

print(plantData)
} catch let parseError {
print(parseError)
}

注意 filter仅选择那些出现 monthlyAVG 的行不是 nil .


其他一些建议:

  1. 就个人而言,如果可以的话,我宁愿看到设计为仅返回您想要的值(具有实际 monthlyAVG 的值)然后更改 monthlyAVG 的 Web 服务属性不是可选的。但这取决于你。

  2. 如果 monthlyAVG确实是一个数字平均值,我会更改 Web 服务以根本不将其作为字符串返回,而是作为不带引号的数字返回。然后更改 Plant 的属性成为Double或其他。

  3. 如果需要,您可以更改 date属性为 Date然后使用 dateDecodingStrategy将字符串转换为 Date :

    struct Plant: Codable {
    let date: Date
    let monthlyAVG: String?

    enum CodingKeys : String, CodingKey {
    case date = "Date"
    case monthlyAVG = "30_Day_MA_MMBTU"
    }
    }

    do {
    let decoder = JSONDecoder()
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-dd"
    decoder.dateDecodingStrategy = .formatted(formatter)

    let plantData = try decoder.decode([Plant].self, from: data)
    .filter { $0.monthlyAVG != nil }

    print(plantData)
    } catch let parseError {
    print(parseError)
    }

    例如,如果您希望图表的 x 轴实际表示时间而不是一组均匀分布的数据点,则可以这样做。

关于swift - .decode 在 swift 4 中返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48953944/

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