如何在泛型类中使用类类型

时间:2016-09-24 19:51:26

标签: ios swift generics metaprogramming

从日志文件中我获得一个包含类名称的字符串,例如"儿童"可以定义为:

class Child: Object, MyProtocol {
// ...
}

我想在以下泛型类中使用此类:

open class MyClass<T: Object> where T:MyProtocol {
    //…

    open class func doSomething() {
    //…
    }

}

我已经问了一个问题here如何从字符串中获取类类型,可以通过以下方式获取:

let objectType = NSClassFromString("MyModule.\(strFromLog)”) as! Object.Type

显然,objectType无法直接在MyClass上使用,因为它的类型为T.Type而不是T,以下内容无效:

MyClass<objectType>.doSomething() // -> error: Use of undeclared type 'objectType'

但是,是否还有一种方法可以在objectType中使用MyClass而无需更改泛型类本身(即其他方法依赖它)?

1 个答案:

答案 0 :(得分:0)

很遗憾,您不能将NSClassFromString的结果用作通用类的类型。但是,您可以通过编写以下内容来解决此问题:

protocol SomeProtocol {
}

extension NSString: SomeProtocol {
}

class SomeClass<T: SomeProtocol> {
  class func doSomething() {
  }
}

if let some = NSClassFromString("NSString") {
  if some is NSString.Type {
    SomeClass<NSString>.doSomething()
    print("String")
  } else {
    print("Not String")
  }
}