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

标签 ios swift generics metaprogramming

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

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 而无需更改泛型类本身(即其他方法依赖它)?

最佳答案

不幸的是,您不能使用 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")
  }
}

关于ios - 如何在泛型类中使用类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39680346/

相关文章:

ios - nsuserdefault 不保存数组 - Swift

ios - 如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?

swift - 更改 NSButton 的字体大小不会改变任何内容

ios - 如何区分tableviewcell点击事件中的button和tableviewcell点击事件

vb.net - 在 VB.Net 中运行时迭代未知类型的通用列表

ios - 如何正确使用标识符属性?

ios - 在iOS中允许特殊字符

ios - 通过 AirDrop 发送即时创建的 QR 码 UIImage 失败

java - 泛型映射 - 避免大量强制转换

Java 集合类型参数到数组