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

标签 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 是一个类,出于某种原因我无法使用协议(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 as class


编辑:

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

Xcode 自动完成建议您传递符合 Parent 的类型协议(protocol) Parent as protocol

关于swift - 在方法中使用类作为泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516963/

相关文章:

ios - ImageView 的奇怪边框故障

swift - NSSegmentedControl 操作未触发

ios - Swift Progress View 动画使进度条超过 100%

java - 确保通用参数不是原始参数

c# - 如何从这种一般情况下获取类型?

IOS Xcode 验证 Xcode.app

ios - 使用水车 pod 对 iOS swift 进行 drupal 身份验证

java - 用于反射的泛型类型声明

java - Eclipse 不会推断匿名类的泛型吗?

c# - Entity Framework 中不同表的抽象操作