如何使用具有关联类型的协议初始化通用枚举?

时间:2019-12-18 12:47:21

标签: swift generics enums

请考虑以下枚举和协议的定义

enum Result<T> {
    case success(info: T)
    case failure(message: String)
}

protocol Response {
    associatedtype T
    var info: T? { get }
}

我正在尝试使用实现Result协议的值来初始化Response

以下代码无法编译。

extension Result {
    init(response: Response) {
        // body of the initializer
    }
}

谁能指出解决方法?

1 个答案:

答案 0 :(得分:4)

类似这样的东西:

extension Result {
    init<R: Response>(response: R) where R.T == T {
        if let info = response.info {
            self = .success(info: info)
        } else {
            self = .failure(message: "Whoops")
        }
    }
}

您不能直接使用带有协议的类型,因此应将它们用作通用参数。