J'essaie d'utiliser basé sur l'arborescence B OrderedSet
de Károly Lőrentey dans un projet. Cependant, je rencontre un problème où je ne peux pas déclarer un OrderedSet<T>
Non qualifié parce que le nom entre en conflit entre NSOrderedSet
(importé en tant que OrderedSet
dans Swift 3) et BTree
's 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
Pour résoudre ce conflit, vous devez normalement qualifier le nom et cela vous donnera BTree.OrderedSet<T>
. Cependant, le module BTree
contient également une classe nommée BTree
. Si j'écris BTree.OrderedSet
, Swift pense que je fais référence à un type nommé OrderedSet
qui est imbriqué dans le type BTree.BTree
.
let set = BTree.OrderedSet<Int>()
// error: reference to generic type 'BTree' requires arguments in <...>
Si je ne le fais pas import BTree
, Je ne peux pas du tout utiliser le nom BTree
.
// no import BTree
let set = BTree.OrderedSet<Int>()
// error: use of undeclared type 'BTree'
Comment puis-je résoudre cette ambiguïté entre le type BTree
et le module BTree
?
Le type peut être ambigu à l'aide de la syntaxe import (class|struct|func|protocol|enum) Module.Symbol
peu connue.
import struct BTree.OrderedSet
À partir de ce moment, OrderedSet se réfère sans ambiguïté à celui de BTree.
Si cela reste ambigu ou sous-optimal dans certains fichiers, vous pouvez créer un fichier Swift pour renommer les importations en utilisant des typologies:
// 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
Une nouvelle syntaxe a été discutée pour Swift 3, mais elle a échoué.
J'ai renommé OrderedSet
en SortedSet
dans le version Swift 3 de BTree
, qui devrait servir de solution de contournement pendant qu'un éventuel correctif au niveau de la langue est en cours discuté/mis en œuvre.