【问题标题】:How to use a class type in a generic class如何在泛型类中使用类类型
【发布时间】:2017-02-02 11:16:12
【问题描述】:

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

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'

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

【问题讨论】:

    标签: ios swift generics metaprogramming


    【解决方案1】:

    很遗憾,您不能将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")
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      相关资源
      最近更新 更多