菜鸟教程小白 发表于 2022-12-11 20:03:37

swift - 如何消除具有相同名称的类型和模块的歧义?


                                            <p><p>我正在尝试使用 Károly Lőrentey 的 <a href="https://github.com/lorentey/BTree" rel="noreferrer noopener nofollow">B-tree based <code>OrderedSet</code></a>在一个项目中。但是,我遇到了一个问题,我无法声明不合格的 <code>OrderedSet<T></code> 因为 Foundation 的 <code>NSOrderedSet</code> 之间的名称冲突(导入为 <code>OrderedSet</code> in Swift 3) 和 <code>BTree</code> 的 <code>OrderedSet</code>。</p>

<pre><code>let set = OrderedSet&lt;Int&gt;()
// error: &#39;OrderedSet&#39; is ambiguous for type lookup in this context
// Found this candidate: Foundation.OrderedSet:3:14
// Found this candidate: BTree.OrderedSet:12:15
</code></pre>

<p>要解决此冲突,您通常需要限定名称,这将为您提供 <code>BTree.OrderedSet<T></code>。但是,<code>BTree</code> 模块还包含一个名为<code>BTree</code> 的类。如果我编写 <code>BTree.OrderedSet</code>,Swift 认为我指的是嵌套在 <code>BTree.BTree</code> 类型中的名为 <code>OrderedSet</code> 的类型。 </p>

<pre><code>let set = BTree.OrderedSet&lt;Int&gt;()
// error: reference to generic type &#39;BTree&#39; requires arguments in &lt;...&gt;
</code></pre>

<p>如果我不<code>import BTree</code>,我根本就不能使用<code>BTree</code>这个名字。</p>

<pre><code>// no import BTree
let set = BTree.OrderedSet&lt;Int&gt;()
// error: use of undeclared type &#39;BTree&#39;
</code></pre>

<p>如何解决 <code>BTree</code> 类型和 <code>BTree</code> 模块之间的这种歧义?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>可以使用鲜为人知的 <code>import (class|struct|func|protocol|enum) Module.Symbol</code> 语法来消除类型的歧义。</p>

<pre><code>import struct BTree.OrderedSet
</code></pre>

<p>从现在开始,OrderedSet 明确地指向 BTree 中的那个。</p>

<p>如果这在某些文件中仍然模棱两可或次优,您可以创建一个 Swift 文件以使用 typealiases 重命名导入:</p>

<pre><code>// a.swift
import struct BTree.OrderedSet
typealias BTreeOrderedSet&lt;T&gt; = BTree.OrderedSet&lt;T&gt;
</code></pre>

<p> </p>

<pre><code>// b.swift
let foo = OrderedSet&lt;Int&gt;() // from Foundation
let bar = BTreeOrderedSet&lt;Int&gt;() // from BTree
</code></pre>

<p>曾为 Swift 3 讨论过一种新语法,但没有通过。</p></p>
                                   
                                                <p style="font-size: 20px;">关于swift - 如何消除具有相同名称的类型和模块的歧义?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/49909171/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/49909171/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: swift - 如何消除具有相同名称的类型和模块的歧义?