【问题标题】:How can I disambiguate my type from a module type如何区分我的类型与模块类型
【发布时间】:2020-07-01 09:16:53
【问题描述】:

我在引用来自 3rd 方模块的符号时遇到问题,我的代码如下所示:

import Foo // 3rd party module

struct Foo { // my type on my module
    //...
}

struct Bar: Foo.ProtocolA { // here swift referes to my struct instead of the module
    
}

我不能只使用: ProtocolA,因为该名称已在我的模块中使用。

有没有办法消除歧义?

我见过类似的问题,但它们解决了不同的问题,消除了模块类型而不是自己的类型的歧义。

TIA

【问题讨论】:

标签: swift


【解决方案1】:

您可以通过直接从父模块导入子模块来解决此问题;例如在你的例子中会变成这样:

import protocol Foo.ProtocolA

您可以指定要导入的许多类型,例如类 enum let/var 等,而不仅仅是协议。

明显的缺点是,如果您需要来自特定父模块的大量子模块,导入量会迅速膨胀。 就我个人而言,我通常会尽量避免命名冲突,有时会以稍微不那么描述性的命名为代价,但仍然可以理解。此外,据我所知,目前在 Swift 中无法对导入进行别名。

【讨论】:

  • 我试图这样做,但是当我想遵守协议时,它仍然会引用我的结构。我试图用typealias Something = Foo.ProtocolA 给它起别名(是的,有可能:D)也没有工作
  • 这不是我所说的别名;对于 instanec "import Foo as Foo2" 将是别名,正如我的意思。无论如何,如果上面的导入没有正确地使您的代码库中的“ProtocolA”可用,那么这听起来像是您应该提交的编译器错误。
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多