Swift内置协议可以重新声明吗?为什么?

时间:2017-03-07 08:38:44

标签: swift protocols declaration

我发现了一个非常令人困惑的事情:我们可以重新声明快速内置协议,任何人,例如SequenceUITableViewDelegate。没有编译错误,甚至没有警告。有人能解释一下为什么吗?如果这是事实真相,它会如何影响内置的?

2 个答案:

答案 0 :(得分:1)

您可以使用库名称前缀(例如UIKit.UITableViewDelegateFoundation.Sequence)来使用内置的。

它们位于不同的模块中,Swift以一种您不必指定模块名称的方式公开这些协议。但无论何时创建自己的,都需要指定它。此规则适用于所有情况。

答案 1 :(得分:1)

  

我发现了一个非常令人困惑的事情:我们可以重新声明swift内置协议,任何人,比如Sequence和UITableViewDelegate。没有编译错误,甚至没有警告。有人能解释我为什么吗?

类,结构,枚举,协议和全局变量都是由模块名称间隔开的名称。如果您在应用程序Sequence中声明了名为MyApp的协议,则其全名将为MyApp.Sequence。为方便起见,如果省略名称的模块部分,编译器将尝试猜测它是什么。

  

如果这是事实,它会如何影响内置的?

如果您确定与其中一个系统模块中的类型具有相同名称的内容,编译器将在同一模块中使用您的版本作为首选项。其他人的代码,包括Apple框架中的代码,将不受影响。您可以通过指定类型的模块名称来消除歧义。因此,在MyApp中,您可以通过编写Sequence来使用原始Swift.SequenceSwift是Swift标准库类型的模块名称。)