Swift 2.2 - 使用带有 class 类型可变参数的初始化器
Swift 2.2 - Using initialiser with variadic parameters of class type
在 Swift 2.2 中,我有以下 classes:
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))
}
}
}
如果我只向容器添加一个 class 类型,那么它编译得很好:
let c = Container(FirstImpl)
但是如果我开始添加更多 class 类型,那么它将无法编译:
let c = Container(FirstImpl, SecondImpl)
构建错误为:
无法将类型“(FirstImpl, SecondImpl).Type”的值转换为预期的参数类型 'Base.Type'
这是 Swift 编译器的限制还是我做错了什么?
这是一条令人困惑的错误消息,但问题是您需要使用 .self
才能将 类 的 refer to the types 传递给函数。因此你会想要做:
let c = Container(FirstImpl.self, SecondImpl.self)
您的第一个没有 .self
的编译示例实际上是 a bug (which has been resolved as of Swift 3) – see 以获取更多信息。
在 Swift 2.2 中,我有以下 classes:
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))
}
}
}
如果我只向容器添加一个 class 类型,那么它编译得很好:
let c = Container(FirstImpl)
但是如果我开始添加更多 class 类型,那么它将无法编译:
let c = Container(FirstImpl, SecondImpl)
构建错误为:
无法将类型“(FirstImpl, SecondImpl).Type”的值转换为预期的参数类型 'Base.Type'
这是 Swift 编译器的限制还是我做错了什么?
这是一条令人困惑的错误消息,但问题是您需要使用 .self
才能将 类 的 refer to the types 传递给函数。因此你会想要做:
let c = Container(FirstImpl.self, SecondImpl.self)
您的第一个没有 .self
的编译示例实际上是 a bug (which has been resolved as of Swift 3) – see