2017-04-18 1 views
3

Ich habe eine Klasse mit Enum-Eigenschaft state. Der Wert dieser Eigenschaft (nach Wert I bedeutet ReactiveSwift.Property) muss von anderen Klassen aufgerufen und beobachtet werden, aber die Wertänderung sollte privat sein. Derzeit ist es in einer solchen Art und Weise umgesetzt:ReactiveSwift veränderbare Eigenschaft mit nur lesen öffentlichen Zugang

enum State { 
    case stopped, running, paused 
} 

var state: Property<State> { 
    return Property(mutableState) 
} 
fileprivate let mutableState = MutableProperty<State>(.stopped) 

Dieses Muster mich mutableState Eigenschaft innerhalb Klassendatei ändern können. Gleichzeitig ist der Klassenzustand außerhalb des Klassenzustandes nur zum Lesen und Beobachten verfügbar.

Die Frage ist, ob es eine Möglichkeit gibt, eine ähnliche Sache mit einer einzigen Eigenschaft zu implementieren? Kann jemand wahrscheinlich auch ein besseres Muster für die gleiche Lösung vorschlagen?

Antwort

4

ich kann‘ Es gibt keine Möglichkeit, dies mit einer einzigen Eigenschaft zu tun. Die einzige Einstellung ich an Ihren Code machen würde, ist state eine gespeicherte Eigenschaft zu machen, anstatt eine berechnete Eigenschaft, die jedes Mal neu erstellt wird, auf sie zugegriffen wird:

class Foo { 
    let state: Property<State> 

    fileprivate let mutableState = MutableProperty<State>(.stopped) 

    init() { 
     state = Property(mutableState) 
    } 
} 
+0

Ja, aber wahrscheinlich ist es sogar eine bessere Lösung, es faul zu machen. Aber das macht auch Sinn. – iyuna

1

Abhängig davon, wo Sie den Staat mutieren möchten, können Sie versuchen, entweder zu tun:

private(set) var state: Property<State> 

oder wenn Sie es von einer Erweiterung ändern, aber immer noch die gleiche Datei

fileprivate(set) var state: Property<State> 
+0

ja, ich dachte darüber nach. Aber das erlaubt mir, 'State'-Eigenschaft selbst zu modifizieren. Und ich muss den Wert von 'state' Eigenschaft ändern. Ich meine 'ReactiveSwift.Property' sowie' ReactiveSwift.MutableProperty' haben Eigenschaft 'value'. Das muss ich ändern. Entschuldigen Sie das Durcheinander. – iyuna

Verwandte Themen