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:
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?
Die Angabe von U: RawRepresentable where U.Raw == String
schien hoffnungsvoll, also habe ich es versucht:
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
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% 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:
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.
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. :)
Tags und Links swift rawrepresentable