基于枚举作为参数的情况,Swift从函数返回不同的数据类型

时间:2019-02-10 17:52:13

标签: swift return-type

我正在编写TokenManager类,该类的JWT令牌存储在String中。可以将其从JSON解码为ClaimsData类型的对象

struct ClaimsData: Codable {
    let user_id: Int
    let username: String
    let exp: Int
    let email: String
    let orig_iat: String
}

现在,我希望拥有一个负责提供特定数据的功能。但是,只有在TokenManager的isAuthorized属性为true时才应返回数据,因此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可能是一种选择,但据我所知并不是很迅速。

1 个答案:

答案 0 :(得分:3)

根据函数参数的值,您不能有不同的返回类型。

但是您可以编写一个具有 key path 参数的通用函数:

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>