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

时间:2018-05-24 19:37:36

标签: swift generics

我使用以下泛型方法返回子类

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是一个类,由于某种原因,我无法使用协议或将其更改为协议。

1 个答案:

答案 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 as class

修改

如果您将设计略微修改为ParentClassParent协议,则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协议的类型 Parent as protocol