作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写 TokenManager 类,它有一个存储在字符串中的 JWT token 。它可以从 JSON 解码为 ClaimsData 类型的对象
struct ClaimsData: Codable {
let user_id: Int
let username: String
let exp: Int
let email: String
let orig_iat: String
}
现在我希望有一个函数负责提供特定的数据。但它应该只在 TokenManager 的 isAuthorised 属性为真时返回数据,因此 claimsData 不为零。所以我写了这段代码:
enum ClaimsOfInt {
case user_id
case exp
}
enum ClaimsOfString {
case username
case email
case orig_iat
}
enum Result<T> {
case success(T)
case notAuthorised
}
func get(_ claim: ClaimsOfInt) -> Result<Int> {
if let claimsData = claimsData {
switch claim {
case .user_id:
return .success(claimsData.user_id)
case .exp:
return .success(claimsData.exp)
}
} else {
return .notAuthorised
}
}
func get(_ claim: ClaimsOfString) -> Result<String> {
if let claimsData = claimsData {
switch claim {
case .username:
return . success(claimsData.username)
case .email:
return . success(claimsData.email)
case .orig_iat:
return . success(claimsData.orig_iat)
}
} else {
return .notAuthorised
}
}
如您所见,我有两个函数,每种函数一个。我想现在已经足够好了,但我想知道是否可以使用例如泛型以某种方式将其编写为一个函数?如果是这样,它会是什么样子?使用 Any 可能是一种选择,但据我所知,它不是很快捷。
最佳答案
你不能有不同的返回类型,这取决于函数参数的值。
但是您可以编写一个带有关键路径参数的通用函数:
func get<T>(claimsData: ClaimsData?, key: KeyPath<ClaimsData, T>) -> Result<T> {
if let claimsData = claimsData {
return .success(claimsData[keyPath: key])
} else {
return .notAuthorised
}
}
示例用法:
let result = get(claimsData: claimsData, key: \.user_id)
这里的结果类型被推断为 Result<Int>
.
关于Swift 根据作为参数给出的枚举的大小写从函数返回不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619264/
我是一名优秀的程序员,十分优秀!