什么是Swift.AnyClass?

4

我在研究UITableView类时发现:

open func register(_ cellClass: Swift.AnyClass?, forCellReuseIdentifier identifier: String)

这里了解到,AnyClass实际上是一个类型别名。

typealias AnyClass = AnyObject.Type

我不理解的是什么是Swift.AnyClassSwift的作用是什么? 我已经知道它所需要的参数类似于CustomTableViewCell.self

我猜它是所有其他类的超类。类型为AnyClass的东西可以是任何类型。Swift部分可能是与语言相关的命名空间。 - Carcigenicate
@Carcigenicate Swift 部分可能是与语言相关的命名空间 <-- 与什么相对比?与哪种其他语法相对比? - mfaani
与经常使用的类/别名相比,他们可能认为大多数人不会经常使用AnyType,因此没有将其包含在全局命名空间中。 - Carcigenicate
1
参见Swift标准库和名称冲突 - Swift.前缀表示您正在引用Swift模块中的内容。虽然Swift具有隐式顶级命名空间,但除非需要消除歧义,否则不需要显式使用该前缀。 - Hamish
@Hamish 谢谢...这是否意味着在某个地方存在命名空间冲突,因此苹果不得不使用这个?另请参见如何在Swift中使用命名空间 - mfaani
@Honey,很可能只是UITableView的Swift头文件自动生成的问题。 - Hamish
2个回答

4

关于已接受答案的补充信息:

首先,Swift.AnyClassAnyObject.Type的类型别名。这意味着它是一个可以容纳任何“classtype”的元类型,因此在第一位使用了AnyClass作为名称。

class A {}
class B {}

var anyClass: AnyClass? = nil /* could be ': AnyObject.Type' */
anyClass = A.self
anyClass = B.self

var anyInstanceOfAClass: AnyObject? = nil
anyInstanceOfAClass = A()
anyInstanceOfAClass = B()

Swift 是标准库的实际模块名称。如果您需要消除歧义,可以自行使用它。例如,您可以这样做:

struct Array<T> {
   private var array: Swift.Array<T> { ... } 
}

2

仅仅为了澄清一下,正如有人已经说过的那样,Swift是运行时的虚拟模块名称,语言中定义的每个对象、类型和内置类型也都可以从这个命名空间访问到。

在这种情况下,为什么类型声明为Swift.AnyClass而不是简单地AnyClass?

我认为这次没有必要避免与UITableView范围内定义的某些类型发生名称冲突。这可能与UIKit仍然是用Objective-C编写有关。

他们可能实现了一个“解决方法”,在函数原型中使用更好看的AnyClass类型,这个类型在Swift运行时中定义,通常作为全局typedef在Objective-C中不可用。

我的猜测是,他们手动导入了Swift模块(或只有几个定义的较小的模拟模块)到UIKit中,你在那里看到的就是这个结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接