gpt4 book ai didi

Swift 根据作为参数给出的枚举的大小写从函数返回不同的数据类型

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:01 24 4
gpt4 key购买 nike

我正在编写 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com