![](/img/trans.png)
[英]How to use generic type in function parameter from generic class in Swift
[英]Use class as generic type parameter in a method
我正在使用以下通用方法返回子类
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
是一个类,由于某种原因,我无法使用协议或将其更改为协议。
是的你可以。 但是我很困惑您将如何使用它。
您需要稍微修改getClass<T: ParentClass>() -> T?
的签名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()
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.