我发现了一个非常令人困惑的事情:我们可以重新声明快速内置协议,任何人,例如Sequence
和UITableViewDelegate
。没有编译错误,甚至没有警告。有人能解释一下为什么吗?如果这是事实真相,它会如何影响内置的?
答案 0 :(得分:1)
您可以使用库名称前缀(例如UIKit.UITableViewDelegate
或Foundation.Sequence
)来使用内置的。
它们位于不同的模块中,Swift以一种您不必指定模块名称的方式公开这些协议。但无论何时创建自己的,都需要指定它。此规则适用于所有情况。
答案 1 :(得分:1)
我发现了一个非常令人困惑的事情:我们可以重新声明swift内置协议,任何人,比如Sequence和UITableViewDelegate。没有编译错误,甚至没有警告。有人能解释我为什么吗?
类,结构,枚举,协议和全局变量都是由模块名称间隔开的名称。如果您在应用程序Sequence
中声明了名为MyApp
的协议,则其全名将为MyApp.Sequence
。为方便起见,如果省略名称的模块部分,编译器将尝试猜测它是什么。
如果这是事实,它会如何影响内置的?
如果您确定与其中一个系统模块中的类型具有相同名称的内容,编译器将在同一模块中使用您的版本作为首选项。其他人的代码,包括Apple框架中的代码,将不受影响。您可以通过指定类型的模块名称来消除歧义。因此,在MyApp
中,您可以通过编写Sequence
来使用原始Swift.Sequence
(Swift
是Swift标准库类型的模块名称。)