2016-06-18 9 views
19

私はKárolyLohrenteyのB-tree based 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はタイプでネストされているOrderedSetという名前のタイプを参照していると考えています。私はimport BTreeない場合

let set = BTree.OrderedSet<Int>() 
// error: reference to generic type 'BTree' requires arguments in <...> 

することは、私は全くBTree名前を使用することはできません。

// no import BTree 
let set = BTree.OrderedSet<Int>() 
// error: use of undeclared type 'BTree' 

どのように私はBTreeタイプとBTreeモジュール間のこの曖昧さを解決することができますか?

+0

これは大きな質問です。それらのうちの1つを「タタリアス」できますか? – NRitH

+0

私はtypeAliasを使用することができません。タイプリアアースは名前を作成するだけです( 'OrderedSet'は有効で、あいまいでない場合は両方のタイプの名前になります)。しかし、タイプアリア1にしても、私はそれを参照できるようにする必要があります... – zneak

+0

私はこのプロジェクトでFoundationを使用しないので、私は#include を削除して自分自身のブロックを解除することができましたブリッジヘッダーしかし、それは一般的な(そして実際の)問題を解決するものではありません。 – zneak

答えて

16

(ほとんど知られていない)import (class|struct|func|protocol|enum) Module.Symbolの構文を使用して、タイプを明確にすることができます。

import struct BTree.OrderedSet 

この時点から、OrderedSetは、明らかにBTreeのものを参照しています。

これはまだいくつかのファイルでは曖昧または次善だろう場合、あなたは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 

議論新しい構文がありましたスイフト3のために、しかしそれは落ちた。

+4

ありがとう! 'protocol'、' enum'を使うこともできます。つまり、インポート後に型を定義して特定の型だけをインポートするすべてのキーワードを使用できます。 – cicerocamargo

2

Iは可能言語レベルの修正を実施/議論されている間、回避策として役立つべき、Swift 3 version of BTreeSortedSet内にOrderedSetと改名。

+0

私は数分前に再びメーリングリストで問題を提起しました。うまくいけば物事が起こる。 – zneak

関連する問題