如何创建一个Swift泛型可变参数函数?

3

以下是我的代码

protocol P {}
class BaseClass {}
class AA: BaseClass, P {}
class BB: BaseClass {}
class CC: BaseClass, P {}


func test1<T>(value: T.Type...) where T: BaseClass & P {
}

这里我们有两个 BaseClass 的子类 AA 和 BB。
AA 和 CC 符合协议 P。BB 不符合协议 P。
如何使用函数只接受多个参数的 AA 和 CC,但拒绝 BB?
我尝试过这样做:
test(AA.self, BB.self)

这让我出现了编译时错误。有没有办法实现上述行为?
1个回答

4

一种方法可能是为BaseClassP的配对声明一个typealias

protocol P {}
class BaseClass {}
class AA: BaseClass, P {}
class BB: BaseClass {}
class CC: BaseClass, P {}

typealias BaseP = BaseClass & P
func test1(value: BaseP.Type...) {
    for t in value {
        print(t)
    }
}

test1(value: AA.self, CC.self) // prints "AA" and "CC"

// fails: "cannot convert value of type 'BB.Type' to expected argument type 'BaseP.Type' (aka '(BaseClass & P).Type')"
//test1(value: AA.self, BB.self) 

3
func test(_ value: (BaseClass & P).Type...) { 将此函数翻译为中文: - Leo Dabus
这样的回答让我想知道为什么我浪费了整整一天的时间。谢谢,朋友。 - Just a coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接