我正在尝试在项目中使用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
模块之间的这种歧义?
答案 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
,这可以作为一种解决方法,同时正在讨论/实施可能的语言级修复。