Swift的type(of:)函数命名空间及命名冲突解决咨询
关于Swift中
type(of:)函数与命名冲突的问题 1. type(of:)函数的命名空间
type(of:)是Swift标准库提供的全局函数,它属于Swift模块的顶级命名空间。在没有命名冲突的场景下,直接写type(of:)就能正常调用;如果需要明确指定,也可以用Swift.type(of:)的完整形式。
2. 解决命名冲突的问题
你推测的完全正确!这个报错确实是因为Foo类里定义的type属性,和全局的type函数(也就是type(of:)对应的那个全局符号)发生了命名冲突——编译器在类的作用域里优先找到了Int类型的type属性,自然会报错“不能调用非函数类型的Int”。
要消除歧义,只需要用Swift模块名来限定全局的type函数即可,修改后的代码如下:
class Foo: CustomDebugStringConvertible { let type: Int = 0 var debugDescription: String { return "<\(Swift.type(of:self)) type: \(type)>" } }
补充说明:Swift的全局命名空间本质就是Swift模块,所有标准库的全局符号(函数、基础类型等)都默认归属于这个模块。当局部作用域出现同名符号时,通过模块名.符号名的写法就能明确访问全局的目标符号。
内容的提问来源于stack exchange,提问作者Heath Borders
相关产品推荐
相关产品推荐

