.self 在 Swift 中的结构类型之后

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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")

【讨论】:

以上是关于.self 在 Swift 中的结构类型之后的主要内容,如果未能解决你的问题,请参考以下文章

swift 在swift via option中使用结构中的多个类型

Swift 中的拖放 - 注册拖动类型的问题?

如何在 Swift 的视图层次结构顶部添加视图?

如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]

在iOS9 swift中的字典类型中添加数组作为键和值

Swift 协议中的弱属性只能是类或类绑定协议类型