【发布时间】:2021-11-03 00:28:35
【问题描述】:
我正在尝试编写一个简单的函数来处理返回 JWT 令牌的身份验证 POST 请求。
我的LoopBack 4 API 将令牌作为 JSON 数据包返回,格式如下:
{ "token": "my.jwt.token" }
如果发生错误,则返回以下内容:
{
"error": {
"statusCode": 401,
"name": "UnauthorizedError",
"message": "Invalid email or password."
}
}
如您所见,这些类型完全不同,它们没有任何共同的属性。
我定义了以下 Swift 结构来表示它们:
// Success
struct Token: Decodable {
let token: String
}
// Error
struct TokenError: Decodable {
let error: ApiError
}
struct ApiError: Decodable {
let statusCode: Int
let name: String
let message: String
}
返回 Swift 泛型的身份验证请求的签名:
@available(iOS 15.0.0, *)
func requestToken<T: Decodable>(_ user: String, _ password: String) async throws -> T
我一直在尝试对这个函数进行单元测试,但 Swift 要求我预先声明结果的类型:
let result: Token = try await requestToken(login, password)
这对于快乐路径非常有效,但如果身份验证不成功,则会引发 The data couldn’t be read because it is missing. 错误。我当然可以抓住它,但我无法将结果转换为我的 TokenError 类型以访问其属性。
我在 StackOverflow 上遇到了一些线程,一般建议是通过通用协议表示成功和错误类型,但由于与 Decodable 协议的冲突,我没有运气。响应类型已经符合。
所以问题是我的requestToken 函数返回的result 变量是否可以同时使用成功和错误。
【问题讨论】:
标签: swift generics async-await decodable loopback4