我使用以下泛型方法返回子类
class SomeClass {
var childInstance: ParentClass?
func getClass<T: ParentClass>() -> T? {
return childInstance as? T
}
func usage() {
if let view: ChildTwo = self.getClass() {
view.someMethodOfClassTwo()
}
}
}
是否可以将类作为泛型类型参数传递?所以使用没有if语句,如下所示:
self.getClass(type: ChildTwo)?.someMethodOfClassTwo()
上面使用的父/子课程如下:
class ParentClass { }
class ChildOne: ParentClass {
func someMethodOfClassOne() { }
}
class ChildTwo: ParentClass {
func someMethodOfClassTwo() { }
}
更新:ParentClass
是一个类,由于某种原因,我无法使用协议或将其更改为协议。
答案 0 :(得分:2)
是的,你可以。但我很困惑你将如何使用它。
您需要稍微修改getClass<T: ParentClass>() -> T?
功能的签名。我有意识地改变了函数的名称,因为在你实际获得子实例的地方有getClass
的名称是没有意义的。
class SomeClass {
var childInstance: ParentClass?
func getChild<T: ParentClass>(type: T.Type) -> T? {
return childInstance as? T
}
func usage() {
if let child = self.getChild(type: ChildTwo.self) {
child.someMethodOfClassTwo()
}
}
}
您也可以在没有if-let
绑定的情况下使用它。但是你要处理optional chaining
:
SomeClass().getChild(type: ChildTwo.self)?.someMethodOfClassTwo()
这里使用ParentClass
作为一个类,当你传递一个实际上没有多大意义的泛型类类型时,你会得到自动完成:
修改强>
如果您将设计略微修改为ParentClass
为Parent
协议,则Xcode自动完成功能会建议您更有意义的签名。参见:
protocol Parent { }
class ChildOne: Parent {
func functionOfChildOne() { }
}
class ChildTwo: Parent {
func functionOfChildTwo() { }
}
class SomeClass {
var childInstance: Parent?
func getChild<T: Parent>(type: T.Type) -> T? {
return childInstance as? T
}
func usage() {
if let child = self.getChild(type: ChildTwo.self) {
child.functionOfChildTwo()
}
}
}