如何消除同名类型和模块的歧义?
How can I disambiguate a type and a module with the same name?
我正在尝试在项目中使用 Károly Lőrentey 的 B-tree based OrderedSet
。但是,我 运行 遇到了一个问题,我无法声明不合格的 OrderedSet<T>
,因为 Foundation 的 NSOrderedSet
之间的名称冲突(在 [=39= 中导入为 OrderedSet
] 3) 和 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
的 class。如果我写 BTree.OrderedSet
,Swift 认为我指的是嵌套在 BTree.BTree
类型中的名为 OrderedSet
的类型。
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
类型和 BTree
模块之间的歧义?
我在 Swift 3 version of BTree
中将 OrderedSet
重命名为 SortedSet
,这应该作为一种解决方法,而可能的语言级别修复正在 discussed/implemented.
可以使用鲜为人知的 import (class|struct|func|protocol|enum) Module.Symbol
语法来消除类型歧义。
import struct BTree.OrderedSet
从这一点开始,OrderedSet 明确指代 BTree 中的那个。
如果这在某些文件中仍然不明确或次优,您可以创建一个 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 讨论过一种新语法,但未通过。
我正在尝试在项目中使用 Károly Lőrentey 的 B-tree based OrderedSet
。但是,我 运行 遇到了一个问题,我无法声明不合格的 OrderedSet<T>
,因为 Foundation 的 NSOrderedSet
之间的名称冲突(在 [=39= 中导入为 OrderedSet
] 3) 和 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
的 class。如果我写 BTree.OrderedSet
,Swift 认为我指的是嵌套在 BTree.BTree
类型中的名为 OrderedSet
的类型。
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
类型和 BTree
模块之间的歧义?
我在 Swift 3 version of BTree
中将 OrderedSet
重命名为 SortedSet
,这应该作为一种解决方法,而可能的语言级别修复正在 discussed/implemented.
可以使用鲜为人知的 import (class|struct|func|protocol|enum) Module.Symbol
语法来消除类型歧义。
import struct BTree.OrderedSet
从这一点开始,OrderedSet 明确指代 BTree 中的那个。
如果这在某些文件中仍然不明确或次优,您可以创建一个 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 讨论过一种新语法,但未通过。