Я работаю над проектом, использующим MVVM, и мы хотели бы повысить безопасность, не позволяя вызывающей стороне изменять объекты, которые мы выставляем.
Мы не можем сделать Immutable
a struct
и просто пометьте mutate()
как mutating
, потому что мы добавляем наблюдателей, которые мутируют нужный нам объект в форме Immutable
.
В этом примере показано, что мы хотели быда, но мы просто получаем ошибку, которую C
не подтверждает P
, потому что мы пытаемся удовлетворить протокол подклассом необходимого Immutable
, Mutable
class Immutable {}
class Mutable: Immutable {
func mutate() {}
}
protocol P {
var a: Immutable { get }
}
class C: P {
let a: Mutable
init() {
a = Mutable()
a.mutate()
}
}
Есть ли у кого-нибудь креативное решение для этого, которое не требует большого количества шаблонов для обхода, например, создание Immutable
для удовлетворения требований к типу и последующее приведение в линию, например:
class C: P {
let a: Immutable
init() {
a = Mutable()
(a as? Mutable)?.mutate()
}
}
Это неэто не идеально для нас, потому что мы звоним mutate()
много, много раз и не хотим рефакторинга всего нашего кода.