Since RAC 3.0, ReactiveSwift has a clear split between mutable properties and read-only properties, as represented by MutableProperty and AnyProperty. To achieve encapsulation, the pattern of wrapping a private MutableProperty in a public AnyProperty is usually encouraged.
public class Library {
public private(set) lazy var books: Property<[Book]> = .init(self._books)
private let _books = MutableProperty<[Book]>([])
}
However, it does not interoperate well with the native Swift experience of defining stored properties with access control modifiers.