2016-06-18 4 views
19

Ich versuche Károly Lőrenteys B-tree based OrderedSet in einem Projekt zu verwenden. Ich stoße jedoch auf ein Problem, bei dem ich kein unqualifiziertes OrderedSet<T> erklären kann, weil der Name zwischen Foundation NSOrderedSet (importiert als OrderedSet in Swift 3) und BTreeOrderedSet widerspricht.Wie kann ich einen Typ und ein Modul mit dem gleichen Namen disambiguieren?

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 

diesen Konflikt zu lösen, würden Sie normalerweise den Namen qualifizieren, und das würde Sie BTree.OrderedSet<T> geben. Das Modul BTree enthält jedoch auch eine Klasse mit dem Namen BTree. Wenn ich BTree.OrderedSet schreibe, denkt Swift, dass ich auf einen Typ mit dem Namen OrderedSet verweise, der im BTree.BTree-Typ geschachtelt ist.

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

Wenn ich nicht import BTree tun, kann ich nicht verwenden, um die BTree Namen überhaupt.

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

Wie kann ich diese Mehrdeutigkeit zwischen der BTree Art lösen und dem BTree-Modul?

+0

Das ist eine gute Frage. Kannst du 'typalias' eins von ihnen? – NRitH

+0

Ich kann keine von ihnen "typalias" wegnehmen, typialiases kann nur Namen erstellen ('OrderedSet' bleibt ein gültiger, wenn zweideutiger Name für beide Typen). Aber selbst zu Typien eins muss ich in der Lage sein, darauf zu verweisen ... – zneak

+0

Da ich Foundation in diesem Projekt nicht verwende, konnte ich mich durch Entfernen von '#import ' in der überbrückte Header. Das löst jedoch nicht das allgemeine (und sehr reale) Problem. – zneak

Antwort

16

Der Typ kann mit der (extrem wenig bekannten) Syntax import (class|struct|func|protocol|enum) Module.Symbol disambiguiert werden.

import struct BTree.OrderedSet 

Von diesem Punkt an bezieht sich OrderedSet eindeutig auf den in BTree.

Wenn dies noch nicht eindeutig oder suboptimale in einigen Dateien sein würde, können Sie eine Swift-Datei erstellen, die Einfuhren mit typealiases umbenennen:

// 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 

Es gab eine neue Syntax diskutiert für Swift 3, aber es fiel durch.

+4

Danke! Man kann auch "Protokoll", "Aufzählung" verwenden, d. H. Alle Schlüsselwörter, die nach dem Import Typen definieren, um nur einen bestimmten Typ zu importieren. – cicerocamargo

2

Ich habe OrderedSet zu SortedSet in der Swift 3 version of BTree umbenannt, die als Workaround dienen sollte, während eine mögliche Korrektur auf Sprachenebene diskutiert/implementiert wird.

+0

Ich brachte das Problem vor ein paar Minuten wieder auf die Mailing-Liste. Hoffentlich geht es voran. – zneak

Verwandte Themen