首页 > 解决方案 > Swift 泛型类型检查协议一致性

问题描述

假设我有 2 个快速协议:

protocol A: AnyObject {}

protocol B: A {}

在泛型函数上,我想检索传递的类型是否T符合协议A

    func method<T>(_ type: T.Type) -> Bool {
        return T.self is A.Protocol // A.Type fails always
    }

在前面的方法中,如果我发送一个类型A,一切正常,但是如果我尝试发送一个符合B它的类型,它会失败。由于 B 已经符合 A,因此预期结果将为真。

有没有办法实现这个逻辑?

提前致谢。

标签: swiftgenericsprotocols

解决方案


这是实现此目的的一种方法:

protocol A: AnyObject {}
protocol B: A {}

func method<T>(_ type: T.Type) -> Bool {
    return false
}
func method<T: A>(_ type: T.Type) -> Bool {
    return true
}


class Temp1: A {}
class Temp2: B {}
class Temp3 {}

print(method(Temp1.self)) // true
print(method(Temp2.self)) // true
print(method(Temp3.self)) // false

编写两个相同的方法,除了一个有泛型<T>,另一个是<T: A>。在此示例中,Temp1andTemp2将使用该<T: A>方法,而Temp3将仅使用该<T>方法,因为它不符合A.


推荐阅读