40 votes

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

Je suis en train d'utiliser Károly Lőrentey du B-arbre basé OrderedSet dans un projet. Cependant, je suis en cours d'exécution dans une question où je ne peux pas déclarer une inqualifiable OrderedSet<T> parce que le nom des conflits entre la Fondation de l' NSOrderedSet (importés en tant que OrderedSet en Swift 3) et BTrees' 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 le feriez normalement qualifier le nom, et qui vous donnerait BTree.OrderedSet<T>. Cependant, l' BTree module 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 l' BTree.BTree type.

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

Si je n'ai pas l' import BTree, je ne peux pas utiliser l' BTree nom à tous.

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

Comment puis-je résoudre cette ambiguïté entre l' BTree type et l' BTree module?

48voto

zneak Points 45458

Le type peut être ambigu en utilisant 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é.

4voto

Fnord Points 2214

J'ai renommé OrderedSet en SortedSet dans la version Swift 3 de BTree , qui devrait servir de solution de contournement pendant qu'un éventuel correctif au niveau de la langue est discuté / implémenté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X