Swift 的类类型数组,每个类都符合一个协议并且是通用类的子类

use*_*320 3 swift

我在 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

Nor*_*ast 6

您可以通过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)