Wie kann ich in Swift eine Typologie angeben, die RawRepresentable auf String beschränkt?

9

Ich versuche ein Protokoll zu definieren, das eine enum mit dem rohen Wert String erfordert.

Ich glaube nicht, dass es derzeit möglich ist, die Verwendung von enum zu erzwingen, und ich bin mir nicht sicher, ob wirklich wichtig ist, solange ich irgendwo fromRaw() nennen kann. und erhalten eine String .

Ich versuche also, die Kürze der folgenden Zeilen beizubehalten, während Beta auf ein enum beschränkt wird, wobei der rohe Wert ein String ist:

%Vor%

Das Problem mit dem oben genannten ist, dass andere rohe Werte erlaubt sind, und deshalb ist dies gültig:

%Vor%

Um das anzugehen, mache ich das gerade:

%Vor%

Gibt es eine Möglichkeit, das typealias im ursprünglichen Beispiel anders zu deklarieren, um RawRepresentable auf String zu beschränken?

Aktualisieren

Die Angabe von U: RawRepresentable where U.Raw == String schien hoffnungsvoll, also habe ich es versucht:

%Vor%

Während technisch verhindert wird, dass etwas anderes als String verwendet wird, suche ich nach einer Kompilierzeit-Einschränkung, die anscheinend eine Laufzeitausnahme verursacht.

Ich würde es auch vorziehen, dass dies möglichst durch das Protokoll durchgesetzt wird, anstatt dass die Verbraucher das überprüfen müssen .Raw == String

    
Paul Young 09.08.2014, 19:33
quelle

3 Antworten

2

Um nur etwas hinzuzufügen, da es etwas älter ist, funktioniert das aktualisierte Beispiel jetzt in swift 2+ und wird sich zur Kompilierungszeit beschweren, dass .Zeta mehrdeutig ist, es sei denn, es handelt sich um einen String-Typ.

Sie können den Check auch in eine Musterübereinstimmung für eine Protokollerweiterung einfügen. Als Beispiel:

%Vor%     
jimejim 05.12.2015 05:47
quelle
0

Schauen wir uns hier unsere Optionen an. Erstens ist es (wie bei Xcode 6 Beta 5) eine bekannte Einschränkung, dass wir Enum-Typ-Constraints nicht auf einfache und erwartete Weise spezifizieren können. Zweitens brauchen Sie etwas sehr klares: um fromRaw(String) aufrufen zu können. Und drittens wollen Sie einen Compilerfehler. Ich würde sagen, Ihre beste Wette ist, ein Protokoll zu schreiben, um genau das zu tun, und drücken Sie hinunter zum Verbraucher die Anforderung, um sicherzustellen, dass er Ihnen ein fromRaw(String) gibt. In diesem Fall würde ich Folgendes tun, um Ihr zweites Code-Snippet zu vereinfachen:

%Vor%

Philosophisch ist dies imho mehr mit Ihren Bedürfnissen abgestimmt: Sie sagen "Ich will etwas nicht nur RawRepresentable, sondern auch ein fromRaw(String) . Finde heraus, wie du es mir gibst". Die Gamma-Struktur ist das einfachste Beispiel, bei dem der Konsument seine Aufzählung spezifiziert und dann sagt: "Okay, ich kann dir mein Standard fromRaw() geben, weil es funktioniert.

    
Rikkles 10.08.2014 17:09
quelle
0

Ein Kollege und ich haben das besprochen und in Swift 2.0 / 2.1 können Sie dies mit einem Protokoll tun: Ссылка

Habe es in einer App ausprobiert, mit der ich arbeite, funktioniert wie ein Zauber. :)

    
DesignatedNerd 27.10.2015 22:45
quelle

Tags und Links