繁体   English   中英

在方法中使用类作为泛型类型参数

[英]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作为类


编辑:

如果你稍微修改设计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()
        }
    }
}

Xcode自动完成功能建议您传递符合Parent协议的类型 家长作为协议

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM