KárolyLőrenteyの BツリーベースのOrderedSet
をプロジェクトで使用しようとしています。ただし、名前がFoundationのNSOrderedSet
(Swift 3でOrderedSet
としてインポートされている)とBTree
のOrderedSet
の間で競合しているため、未修飾の_OrderedSet<T>
_を宣言できないという問題が発生しています。
_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
という名前のクラスも含まれています。 _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
モジュール間のこのあいまいさを解決するにはどうすればよいですか?
タイプは、あまり知られていないimport (class|struct|func|protocol|enum) Module.Symbol
構文を使用して明確化できます。
import struct BTree.OrderedSet
この時点から、OrderedSetはBTree内のものを明確に参照します。
これがまだあいまいであるか、一部のファイルで最適ではない場合は、Swiftファイルを作成して、typealiasesを使用してインポートの名前を変更できます。
// 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について議論された新しい構文がありましたが、それは失敗しました。
Swift 3バージョンのOrderedSet
でSortedSet
をBTree
に名前変更しました。これは、可能な言語レベルの修正が行われている間、回避策として機能するはずです議論/実装。