Swift协变泛型函数:占位符类型是另一个的子类

时间:2019-01-24 19:13:19

标签: swift generics

我有一个接受两个类作为参数的函数。我希望第一个成为NSObject的子类(到目前为止非常简单),第二个成为另一个的子类或相同的类–我该如何表达呢?

statusBarFrame

MyFunction定义如下:

class MyClass: NSObject {}
class MySubClass: MyClass {}
myFunction(MyClass.Type, MySubClass.Type)

不幸的是,由于MyClass和MySubClass不相同(我对myFunction的定义期望它们完全相同),所以'(MyClass.Type,MySubClass.Type)'的调用错误无法转换为'((MyClass.Type,MyClass.Type)'

如何表达myFunction的第二个参数的类型不必与第一个参数相同,而只是func myFunction<T: NSObject>(param1: T.Type, param2: T.Type) 的事实,正如人们会在Objective-C中编写的那样?

编辑: 看来,我的问题尚不清楚。 以下是不够的: __kindof ...,因为它允许我以定义为func myFunction<T:NSObject,U:NSObject>(param1: T.Type, param2: U.Type)的AnotherClass作为myFunction(param1: MyClass.Type, param2: AnotherClass.Type)来调用它。在这种情况下,AnotherClass在MyClass的继承层次结构之外。

这就是为什么我给出class AnotherClass : NSObject的示例,该示例仅表示(在ObjC中)即协变泛型。

2 个答案:

答案 0 :(得分:1)

这是您需要的吗?运行它没有问题。

class MyClass: NSObject {}
class MySubClass: MyClass {}

func myFunction<T: NSObject>(param1: T.Type, param2: T.Type){
print("OK")
}
myFunction(param1: MyClass.self, param2: MySubClass.self as MyClass.Type)

myFunction(param1: type(of: MyClass()), param2: type(of: MySubClass()))

答案 1 :(得分:0)

Swift编译器当前不支持此功能。您可以在SR-5213下跟踪此功能的实施状态。

不幸的是,根据一位苹果开发人员对此问题的评论,我不希望它很快发生:

  

说实话,我怀疑这不会很快对我们的实施者产生太大的吸引力,因为这不是一个很常见的用例-价值的增加并不能证明近期需要进行的工作。