error.localizedDescription
不会给您一条对调试有用的错误消息。另一方面,如果您打印error
直接地:
print(error)
你会得到类似“预期解码数组但找到字典”的内容,这正是在这种情况下发生的情况
{
"name": "Bobberoo"
}
你正在解码一个[Person].self
,即array of Person
,但您的 JSON 根不是 JSON 数组。如果你这样做的话,上面的 JSON 就可以被解码:
let people = try decoder.decode(Person.self, from: jsonData)
显然,解码正在发生,但它包含在这些上下文中。这些是什么?
这是类型的默认字符串表示形式。你的Person
结构不符合CustomStringConvertible
or CustomDebugStringConvertible
or TextOutputStreamable
, so “Swift 标准库自动提供未指定的结果” https://developer.apple.com/documentation/swift/string/1541282-init(链接指向String.init(reflecting:)
,当您在途中的某个地方可能会调用它print
的数组Person
) 并用作字符串表示形式。
据我所知,它当前的实现是结构体的完全限定名称 - 从模块开始,然后是顶级类,然后是每个封闭范围,以结构体名称结尾,后面是括号中的结构体成员。事实证明,封闭的范围没有“名称”,因此只是被称为(unknown context at xxxxx)
。这都是非常多的实现细节,以及您不应该关心的事情。
你应该做的是提供一个实现CustomStringConvertible
:
struct Person: CustomStringConvertible {
...
var description: String { "name: \(name)" }
}
正在打印people
gives:
[name: Bobberoo]
我可以看到第一个是WebSocketController
.
No. The WebSocketController
是您的完全限定名称的一部分Person
结构。解码后的数组中只有一个实例,它是Person
,如您所料!
我如何访问这些数据?
要访问其名称:
if let firstPerson = people.first {
let firstPersonsName = firstPerson.name
}