【问题标题】:.self after struct type in Swift.self 在 Swift 中的结构类型之后
【发布时间】:2018-04-25 15:18:59
【问题描述】:

我对 Metal 示例中的一行代码感到困惑,其中内存指针绑定到一个类型。

uniforms = UnsafeMutableRawPointer(uniformBuffer.contents()).bindMemory(to: Uniforms.self, capacity: 1)

我的困惑是Uniforms 类型之后的.selfUniforms 是在 Objective-C 文件中定义的结构,如果没有 .self 在调用中,代码将无法运行。为什么有必要?

【问题讨论】:

    标签: ios objective-c swift reflection metaclass


    【解决方案1】:

    .self 返回对应类型的元类型实例。将其视为类型安全的类型标识符(例如,比使用字符串更安全)。然后,您可以安全地调用此类元类型实例上的可用初始化程序、静态方法、静态属性。

    例如,您也可以将其存储在变量中:

    let metatype: Uniforms.Type = Uniforms.self
    

    Uniforms.Type实际元类型(即类型的类型)。

    元类型速成课程。一个非常简单的示例,可以让您了解这些元数据实际上是如何有用的:

    class Super {
        let id: Int
        required init(id: Int) { self.id = id }
    }
    
    class SubA: Super { ... }
    class SubB: Super { ... }
    
    let subclass: Super.Type = SubA.self
    

    然后,稍后,使用subclass 创建一个实例而不硬编码实际的子类类型名称:

    let obj = subclass.init(id: 123) // new SubA instance.
    

    【讨论】:

      【解决方案2】:

      在 Swift 中,.self 可用于类型以提取其元类型或类型的实例。例如,使用 .self 获取元类型并将其传递给 API:

      self.tableView.registerClass(
          UITableViewCell.self, forCellReuseIdentifier: "myUIViewCell")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-04
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多