我在 Swift 中有一个带有以下形式签名的方法:
func myMethod<T>(class: T.Type) where T: SomeClass & MyProtocol
我想要一个变量,它是一个类数组,这些类都是 SomeClass 的子类并且符合 MyProtocol。
它看起来像:
let classArray = [SubclassOfSomeClass.self, SubclassTwoOfSomeClass.self, SubclassThreeOfSomeClass.self]
其中 SubclassOfSomeClass、SubclassTwoOfSomeClass 和 SubclassThreeOfSomeClass 都符合 MyProtocol
然后我想调用myMethod
如下:
classArray.forEach { classType in
myMethod(class: classType)
}
我收到编译器错误“无法推断通用参数 T”。这对我来说是有意义的 classArray
的类型变量被推断为 [MyClass.Type]
.
我的问题是,我可以以及如何定义变量 classArray
这样编译器就知道其中定义的每个类型都符合协议(protocol) MyProtocol
.
最佳答案
您可以通过让 SomeClass
符合 MyProtocol
来实现。因此每个子类也必须符合 MyProtocol
。
那么你的方法签名就是:
func myMethod<T>(class: T.Type) where T: SomeClass
如果不需要,则可以将 myMethod 的类型更改为非泛型。我认为 swift 无法键入包含 (SomeClass & MyProtocol).Type 元素的数组。在您的情况下,您并没有真正使用通用对象。您确实有一个特定的类型,它是 (SomeClass & MyProtocol).Type
。您的代码看起来像这样:
protocol MyProtocol: class {
}
class SomeClass: NSObject {
}
class SubClass: SomeClass, MyProtocol {
}
class SubClass2: SomeClass, MyProtocol {
}
let classArray: [(SomeClass & MyProtocol).Type] = [SubClass.self, SubClass2.self]
func myMethod(class: (SomeClass & MyProtocol).Type) {
}
classArray.forEach {
myMethod(class: $0)
}
关于类类型的 Swift 数组,每个类类型都符合协议(protocol)并且是普通类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516289/