Изменяемое свойство ReactiveSwift с открытым доступом только для чтения

У меня есть класс со свойством перечисления state. Значение этого свойства (под значением я подразумеваю значение ReactiveSwift.Property) должно быть доступным и наблюдаемым другими классами, но изменение значения должно быть частным. В настоящее время это реализовано таким образом:

enum State {
    case stopped, running, paused
}

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

Этот шаблон позволяет мне изменять свойство mutableState в файле класса. При этом вне класса состояние доступно только для чтения и наблюдения.

Вопрос в том, есть ли способ реализовать подобную вещь, используя одно свойство? Также, возможно, кто-то может предложить лучший шаблон для того же решения?


person iyuna    schedule 18.04.2017    source источник


Ответы (2)


Я не могу придумать, как сделать это с одним свойством. Единственная корректировка, которую я бы внес в ваш код, — это сделать state хранимым свойством, а не вычисляемым свойством, которое создается заново при каждом доступе к нему:

class Foo {
    let state: Property<State>

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

    init() {
        state = Property(mutableState)
    }
}
person jjoelson    schedule 18.04.2017
comment
Да, но, вероятно, сделать его ленивым было бы еще лучшим решением. Но ваш определенно имеет смысл. - person iyuna; 18.04.2017

В зависимости от того, где вы хотите изменить состояние, вы можете попробовать выполнить одно из следующих действий:

private(set) var state: Property<State>

или если вы измените его из расширения, но все равно тот же файл

fileprivate(set) var state: Property<State>
person Alistra    schedule 18.04.2017
comment
да, я думал об этом. Но это позволяет мне изменять свойство state само по себе. И мне нужно изменить значение свойства state. Я имею в виду, что ReactiveSwift.Property, а также ReactiveSwift.MutableProperty имеет свойство value. Это то, что мне нужно изменить. Извините за недопонимание. - person iyuna; 18.04.2017