"Value of optional type Self? not unwrapped" 在具有 "try?" 和 "Self" 的可失败初始值设定项中,如何在不强制解包的情况下编写



我正在尝试在我的协议中添加 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
}
}
}

正如其他人所说,还有其他一些需要考虑的事情:

  1. 编码为.utf8String data(using:)不会失败,因此可以将guard替换为强制解包。
  2. 请考虑将其从可失败的初始值设定项更改为引发的初始值设定项。

可抛出的初始值设定项在这里会更好:

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?,如果他们不关心错误。

相关内容

最新更新