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

时间:2016-06-18 02:11:12

标签: swift swift3

我正在尝试在项目中使用KárolyLőrentey的B-tree based OrderedSet。但是,我遇到了一个我无法声明不合格OrderedSet<T>的问题,因为名称在基金会的NSOrderedSet(在Swift 3中导入为OrderedSet)和{{1}之间存在冲突} BTree

OrderedSet

要解决此冲突,您通常会对该名称进行限定,这将为您提供let set = OrderedSet<Int>() // error: 'OrderedSet' is ambiguous for type lookup in this context // Found this candidate: Foundation.OrderedSet:3:14 // Found this candidate: BTree.OrderedSet:12:15 。但是,BTree.OrderedSet<T>模块还包含一个名为BTree的类。如果我写BTree,Swift认为我指的是嵌套在BTree.OrderedSet类型中的名为OrderedSet的类型。

BTree.BTree

如果我不let set = BTree.OrderedSet<Int>() // error: reference to generic type 'BTree' requires arguments in <...> ,我根本无法使用import BTree名称。

BTree

如何解决// no import BTree let set = BTree.OrderedSet<Int>() // error: use of undeclared type 'BTree' 类型与BTree模块之间的这种歧义?

2 个答案:

答案 0 :(得分:42)

可以使用鲜为人知的import (class|struct|func|protocol|enum) Module.Symbol语法消除类型的歧义。

import struct BTree.OrderedSet

从这一点开始,OrderedSet明确地引用了BTree中的那个。

如果在某些文件中这仍然不明确或次优,您可以使用typealiases创建一个Swift文件来重命名导入:

// a.swift
import struct BTree.OrderedSet
typealias BTreeOrderedSet<T> = BTree.OrderedSet<T>

// b.swift
let foo = OrderedSet<Int>() // from Foundation
let bar = BTreeOrderedSet<Int>() // from BTree

有一个针对Swift 3讨论的新语法,但它已经失败了。

答案 1 :(得分:4)

我在Swift 3 version of BTree中将OrderedSet重命名为SortedSet,这可以作为一种解决方法,同时正在讨论/实施可能的语言级修复。