我在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)
}
我收到编译器错误&#34;无法推断通用参数T&#34;。这对我来说很有意义,因为classArray
变量的类型被推断为[MyClass.Type]
。
我的问题是,可以以及如何定义变量classArray
,以便编译器知道其中定义的每个类型都符合协议MyProtocol
。
答案 0 :(得分:2)
您可以通过SomeClass
符合MyProtocol
来实现这一目标。因此,每个子类也必须符合MyProtocol
。
然后你的方法签名就是:
func myMethod<T>(class: T.Type) where T: SomeClass
如果不需要,那么您可以将myMethod的类型更改为不通用。我认为swift无法输入数组(SomeClass&amp; 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)
}
答案 1 :(得分:0)
protocol MyProtocol {
var x: Int { get }
}
class MyClass: NSObject {
var y: Int = 10
}
class SubClass1: MyClass, MyProtocol {
private(set) var x: Int = 9
}
class SubClass2: MyClass {
}
class SubClass3: MyClass, MyProtocol {
var x: Int { return 15 }
}
let items: [MyClass & MyProtocol] = [SubClass1(), SubClass3()]
func myMethod(_ item: MyClass & MyProtocol) {}
classArray.forEach { myMethod($0) }
因此,目前您只能使用 MyClass&MyProtocol