从string创建classType以作为具体类型传递给泛型参数Swift

时间:2018-06-18 13:02:52

标签: swift generics swift-protocols

我有protocol Pclass A and B,我的目标是使用从字符串创建的类类型参数调用泛型方法a<T: P>(_: T.Type)

protocol P: class {
    static var p: String { get }
}

extension P {
    static var p: String { return String(describing: self) }
}

class A: P {

    func a<T: P>(_: T.Type) {
        print(T.p)
    }
}

class B: P {}

下面的代码有效,因为强制转换为B.Type修复了类类型

let b = "B"
let type = NSClassFromString(b) as! B.Type
A().a(type)

但是如果我们说我们有一个类名数组而不知道它们的具体类型,我们怎么能通过它们呢?

["ClassA", "ClassB", "ClassC"].forEach({ className in
   let type = NSClassFromString(className) as! ????
   A().a(type)
})

1 个答案:

答案 0 :(得分:1)

在Swift中,泛型声明中的类型参数需要在编译时解决。

因此,您的????必须是符合P的具体类型。但是您不能使用您描述的任何具体类型A.TypeB.Type

您可能会知道您无法使用P.Type,因为协议P在Swift中并不符合P本身。


如何将方法a(_:)声明为非泛型的?

class A: P {

    func a(_ type: P.Type) {
        print(type.p)
    }

}

["ModuleName.A", "ModuleName.B"].forEach({ className in
    let type = NSClassFromString(className) as! P.Type
        A().a(type)
})

您可以将类型P.Type的类对象传递给类型P.Type的参数。