2016-04-19 11 views
0

Ich stoße immer wieder auf dieses Problem. Im wirklichen Leben sehe ich Mengen von Zahlen, die eine bestimmte Qualität repräsentieren, aber ich habe Schwierigkeiten, sie in Swift als unterschiedliche Typen auszudrücken.Wie definiere ich einen eingeschränkten Typ in Swift?

Zum Beispiel der Prozenttyp. Lassen Sie mich sagen, ich möchte einen Prozent-Typ mit nur ganzen Zahlen haben. Auch dieser Prozentsatz würde niemals über 100 oder unter Null gehen können.

Ich könnte das in reinem C als eine Union ausdrücken, mit Mitgliedern von 0 bis 100. Allerdings scheint mir die Verwendung der Swift-Enum für den zugrunde liegenden Wert-Typ nicht zu korrigieren Ansatz. Oder ist es?

Lassen Sie uns ein anderes auswählen. Briborb Interbank Zinssatz. Ich weiß, dass es immer zwischen 0 und 20 Prozent liegen wird. Aber die Zahl selbst wird eine Dezimalzahl mit zwei Dezimalstellen sein.

Was ist der richtige Weg, um mit diesem Problem in Swift umzugehen? Generika vielleicht?

+2

"Ich könnte das in reinem C als eine Union ausdrücken". Bitte zeigen Sie den Code davon. – hnh

+0

alles, was ich über "Constraints" mit Typen google up können alle Generics beinhalten. Wenn das mein Problem wäre, würde ich wahrscheinlich meine eigene Klasse (z. B. "BriborInterest") erstellen, wo ich die Eingabe in der Init oder Setter für das Objekt überprüfen und/oder beschränken würde. I.E. Wenn die Eingabe nicht gültig ist, werfen Sie eine Ausnahme aus oder geben Sie nil zurück. –

Antwort

1

Wie sagt Michael im Kommentar, wahrscheinlich so etwas wie folgt aus:

struct IntPercent { 
    let value : Int8 
    init?(_ v : Int) { 
    guard v >= 0 && v <= 100 else { return nil } 
    value = Int8(v) 
    } 
} 

(Anmerkung: eine Struktur verwenden, nicht eine Klasse für einen Basiswert ähnlich)

Wenn Sie, dass viel zu tun Sie können, verbessern, dass ein wenig Protokolle, etwa so:

protocol RestrictedValue { 
    associatedtype T : Comparable 
    static var range : (T, T) { get } 
    var value : T { set get } 
    init() // hack to make it work 
} 

extension RestrictedValue { 
    init?(v: T) { 
    self.init() 
    guard Self.range.0 <= v && Self.range.1 >= v else { return nil } 
    value = v 
    } 
} 

struct IntPercent : RestrictedValue { 
    static var range = (0, 100) 
    var value : Int = 0 
    init() {} 
} 

ich glaube nicht, Sie Generics verwenden können, Basistyp Werte zu begrenzen.

Aber ich wette, es gibt eine noch bessere Lösung - das man auf jeden Fall nicht awezome :-) ist

0

den Wert eines Objekts Einschränkende ist nicht das gleiche wie ein erzwungener Art. Die Einschränkung von Zahlenwerten macht keinen Sinn, da es sich bei den Dingen um Zahlen handelt - es gibt keine Prozentzahl oder eine Bribor-Interbank-Zinsrate; Sie sind nur Zahlen. Wenn Sie ihren Wert einschränken möchten, tun Sie es, wo immer Sie die Zahlen erhalten oder verwenden. Es ist nicht sinnvoll, einen neuen Typ zu definieren, um die Werte eines vorhandenen Typs zu beschränken.

Verwandte Themen