我在 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)
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误“无法推断通用参数 T”。这对我来说很有意义,因为classArray变量的类型被推断为[MyClass.Type].
我的问题是,我可以以及如何定义变量classArray,以便编译器知道其中定义的每个类型都符合协议MyProtocol。
您可以通过SomeClass符合MyProtocol. 因此,每个子类也必须符合MyProtocol.
那么你的方法签名就是:
func myMethod<T>(class: T.Type) where T: SomeClass
Run Code Online (Sandbox Code Playgroud)
如果不需要,那么您可以将 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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3726 次 |
| 最近记录: |