在swift 4中解码返回什么?
调用在swift 4中解码返回什么?,swift,decode,Swift,Decode,调用.decode()对结构进行解码时,它会返回什么? 我在苹果的文档中查过了,但上面说的都是“内存中表示的本机格式”,但这意味着什么呢?有人能帮我吗 我问这个问题是因为当我从JSON数据中获得空值时,我的应用程序正在崩溃,这行代码: let plantData = try decoder.decode([Plants].self, from: data) 这是我的结构: struct Plants: Codable { let date: String let monthl
.decode()
对结构进行解码时,它会返回什么?
我在苹果的文档中查过了,但上面说的都是“内存中表示的本机格式”,但这意味着什么呢?有人能帮我吗
我问这个问题是因为当我从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)]
以下是来自web的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}
]
JSONDecoder
的decode
方法是一种“通用”方法。它返回在方法的第一个参数中指定的任何类型的实例。在您的情况下,它返回一个[Plants]
,即数组
,即植物
实例的快速数组
如果它因为JSON中的null
值而崩溃,那么您必须确定什么是null,是否适合为null,如果是,请确保与可能为null
的值关联的任何Plants
属性都应该是可选的
根据您用代码片段更新的答案,我建议:
// 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"
}
}
以及:
注意过滤器
行,它只选择那些monthlyAVG
不是nil
的事件
还有一些其他建议:
monthlyAVG
的值),然后将monthlyAVG
属性更改为非可选属性。但这取决于你monthlyAVG
实际上是一个数字平均值,我会将web服务更改为完全不以字符串形式返回,而是以不带引号的数字形式返回。然后将Plant
的属性更改为Double
或其他属性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"
}
}
及
例如,如果希望图表的x轴实际表示时间,而不是一组均匀分布的数据点,则可以这样做我这里有一行特定的代码:let PlantData=try decoder.decode([Plants].self,from:data)。我搞不懂这是怎么回事back@Gina请将您的问题与所有相关详细信息一起提交,而不是在评论中发布信息。是。我发现了空值,我想将其更改为零,或者如果可能的话将其完全删除。我确实将此特定值的属性设置为String?。我正在考虑将解析后的数据传递到另一个函数中,并在其中循环检查空值,然后尽可能删除它们。谢谢。我已经更新了我的问题。谢谢你的耐心。我对斯威夫特很陌生,事实证明很难将我的头脑集中在它上面。@Gina-好的,你的代码看起来不错。这看起来不像是崩溃。你是说你想过滤掉所有出现在
“30天”
为null
的情况吗?或者你在问如何处理那些可选(…)
参考资料?是的。过滤掉“30天”为空的所有事件。这些值应该是一个字符串形式的数字,我假设我必须将它们解析为整数才能使用它们,因为我以后必须在我已经使用iOS图表制作的实时图形上输入这些数字。现在我想了想,我只想完全删除空值,因为我不希望图上出现0。哇,非常感谢!我真的很感激!我将回顾代码,看看是否可以在代码中实现您的建议。
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)
}