Swift 2.2 - 使用具有类类型的可变参数的初始化程序

时间:2016-08-31 10:39:46

标签: swift initialization variadic

在Swift 2.2中,我有以下类:

protocol Base {}

class FirstImpl: Base {}

class SecondImpl: Base {}

class Container {
    private var typeNames = Set<String>()

    init(_ types: Base.Type...) {
       for type in types {
           typeNames.insert(String(type))
       }
    }
}

如果我只向Container添加一个类类型,那么它编译得很好:

let c = Container(FirstImpl)

但是如果我开始添加更多类类型,那么它将无法编译:

let c = Container(FirstImpl, SecondImpl)

构建错误是:

无法转换类型&#39;(FirstImpl,SecondImpl)的值。类型&#39;预期参数类型&#39; Base.Type&#39;

它是Swift编译器的限制还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是一个令人困惑的错误消息,但问题是,在将类传递给函数时,需要使用.self以便refer to the types类。因此,您需要这样做:

let c = Container(FirstImpl.self, SecondImpl.self)

第一个没有.self进行编译的示例实际上是a bug(自Swift 3起已经解决) - 有关详细信息,请参阅this Q&A