web-dev-qa-db-ja.com

同じ名前のタイプとモジュールを明確にする方法を教えてください。

KárolyLőrenteyの BツリーベースのOrderedSet をプロジェクトで使用しようとしています。ただし、名前がFoundationのNSOrderedSet(Swift 3でOrderedSetとしてインポートされている)とBTreeOrderedSetの間で競合しているため、未修飾の_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モジュール間のこのあいまいさを解決するにはどうすればよいですか?

42
zneak

タイプは、あまり知られていない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について議論された新しい構文がありましたが、それは失敗しました。

50
zneak

Swift 3バージョンのOrderedSetSortedSetBTreeに名前変更しました。これは、可能な言語レベルの修正が行われている間、回避策として機能するはずです議論/実装。

4
Karoy Lorentey