首页 > 解决方案 > Swift - 指定符合泛型类型参数的协议

问题描述

我想要做的是有两个泛型类型参数,其中一个是特定类型,另一个是协议,如下所示:

@propertyWrapper
struct Implementation<T, P> where T : AnyObject, T : P { // Compiler error

    var wrappedValue: P { projectedValue }

    var projectedValue: T

    init(_ instance: T) {
        self.projectedValue = instance
    }

}

这样,可以隐藏实际类型,只暴露协议。

现在这不起作用,因为P它是一个非类、非协议类型,所以T不能被限制在它上面。

有没有解决的办法?

标签: swiftgenericsswift-protocolsproperty-wrapper

解决方案


我认为你可以为 T 创建一个协议来继承,那么你根本不需要 P :

protocol ImplementationProtocol: AnyObject {}

@propertyWrapper
struct Implementation<T: ImplementationProtocol> { 

    var wrappedValue: ImplementationProtocol { projectedValue }

    var projectedValue: T

    init(_ instance: T) {
        self.projectedValue = instance
    }

}

现在你的“T”必须符合“ImplementationProtocol”,“wrappedValue”也必须符合“ImplementationProtocol”,就像你在上面的代码中试图完成的那样。

希望能帮助到你


推荐阅读