作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下通用方法返回子类
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
是一个类,出于某种原因我无法使用协议(protocol)或将其更改为协议(protocol)。
最佳答案
是的,你可以。但我很困惑你将如何使用它。
您需要稍微修改您的 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
协议(protocol),那么 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()
}
}
}
关于swift - 在方法中使用类作为泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516963/
我是一名优秀的程序员,十分优秀!