我有一个接受两个类作为参数的函数。我希望第一个成为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中)即协变泛型。
答案 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下跟踪此功能的实施状态。
不幸的是,根据一位苹果开发人员对此问题的评论,我不希望它很快发生:
说实话,我怀疑这不会很快对我们的实施者产生太大的吸引力,因为这不是一个很常见的用例-价值的增加并不能证明近期需要进行的工作。