web-dev-qa-db-fra.com

Comment lever l'ambiguïté d'un type et d'un module du même nom?

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?

42
zneak

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é.

50
zneak

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.

4
Karoy Lorentey