我正在尝试在我的协议中添加 JSON 反序列化功能,但我无法编译decode
函数。如何在不强制解开值包的情况下编写初始值设定项?
protocol Mappable: Codable {
init?(jsonString: String)
}
extension Mappable {
init?(jsonString: String) {
guard let data = jsonString.data(using: .utf8) else {
return nil
}
// TODO:- Value of optional type 'Self?' not unwrapped error
self = try? JSONDecoder().decode(Self.self, from: data)
}
}
>try?
返回一个可选选项。但是在可失败的初始值设定项中,您不会将nil
分配给self
,您return nil
。
以下作品:
extension Mappable {
init?(jsonString: String) {
guard let data = jsonString.data(using: .utf8) else {
return nil
}
do {
self = try JSONDecoder().decode(Self.self, from: data)
} catch {
return nil
}
}
}
正如其他人所说,还有其他一些需要考虑的事情:
- 编码为
.utf8
的String data(using:)
不会失败,因此可以将guard
替换为强制解包。 - 请考虑将其从可失败的初始值设定项更改为引发的初始值设定项。
可抛出的初始值设定项在这里会更好:
protocol Mappable: Codable {
init(jsonString: String) throws
}
extension Mappable {
init(jsonString: String) throws {
let data = jsonString.data(using: .utf8)! // this will never be nil
self = try JSONDecoder().decode(Self.self, from: data)
}
}
这样,您的协议就不会吞噬错误,并且调用者可以简单地使用try?
,如果他们不关心错误。