首页 > 解决方案 > Swift 泛型 T.Type 变为 T.Protocol

问题描述

斯威夫特 5.1

我正在编写一个具有泛型参数的类,它的T一个方法接受一个类型作为参数,其中类型从T.Type. 见foo1下文:

public protocol P {
}

public class C: P {
}

public class X<T> {
    public func foo1(_ t: T.Type) { // The function in question
    }

    public func foo2(_ t: P.Type) {  // Note that this works as expected, but is not generic
    }
}

public func test() {
    let x = X<P>()
    x.foo1(C.self) // ERROR Cannot convert value of type 'C.Type' to expected argument type 'P.Protocol'
    x.foo2(C.self) // Works as expected, but is not generic
}

现在,上课foo1时工作正常。T但是,当T是协议时(例如P),Swift 似乎将我的函数签名从 重写T.TypeT.Protocol

  1. 为什么这样做?
  2. 我如何foo1才能接受继承自的类型P

X在许多其他地方使用——对它的任何更改都不能限制或删除类参数,T也不能减少X的功能,也不能显式引用CP。(限制T排除不扩展的协议是可以接受的AnyObject;不过,我不知道该怎么做。例如,创建一个X添加处理协议能力的子类也可能是可以接受的T,但我'也不知道该怎么做。)

为清楚起见,出于更复杂的项目原因,此类用于注册t符合某些指定父级 ( ) 的类 ( ) 。T(请注意,正在注册类,而不是其实例。)父级在创建时X通过 type 参数给出。它适用于T任何类的 a ,但我也希望它适用于T任何协议的 a ——或至少适用T于任何协议的 a P: AnyObject,在这种情况下foo1应该接受...的任何子类,P就像它在T是一类。

标签: swiftgenericsinheritance

解决方案


即使C P, 但是C.Type != P.Type, 所以错误。

但是泛型的工作方式有点不同,如下例所示:

public class X {
    public func foo1<T>(_ t: T.Type) { // this way
    }

    public func foo3<T:P>(_ t: T.Type) { // or this way
    }

    public func foo2(_ t: P.Type) {  // Note that this works as expected, but is not generic
    }
}

public func test() {
    let x = X()
    x.foo1(C.self) // << works
    x.foo3(C.self) // << works
    x.foo2(C.self) // Works as expected, but is not generic
}

推荐阅读