Swift 使用协议需求的子类
我正在从事一个使用MVVM的项目,我们希望通过阻止调用方改变我们公开的对象来引入更多的安全性 我们不能使Swift 使用协议需求的子类,swift,polymorphism,protocols,subclassing,Swift,Polymorphism,Protocols,Subclassing,我正在从事一个使用MVVM的项目,我们希望通过阻止调用方改变我们公开的对象来引入更多的安全性 我们不能使不可变成为结构,而只是将mutate()标记为mutating,因为我们添加了观察者,使不可变表单中所需的对象发生变异 这个例子显示了我们想要做的事情,但是我们只得到了一个错误,C不能确认为p,因为我们试图用所需的不可变,可变的子类来满足协议 class Immutable {} class Mutable: Immutable { func mutate() {} } prot
不可变
成为结构
,而只是将mutate()
标记为mutating
,因为我们添加了观察者,使不可变
表单中所需的对象发生变异
这个例子显示了我们想要做的事情,但是我们只得到了一个错误,C
不能确认为p
,因为我们试图用所需的不可变
,可变
的子类来满足协议
class Immutable {}
class Mutable: Immutable {
func mutate() {}
}
protocol P {
var a: Immutable { get }
}
class C: P {
let a: Mutable
init() {
a = Mutable()
a.mutate()
}
}
有没有人对此有一个创造性的解决方案,它不需要大量的样板文件来处理,比如制作一个不可变的,以满足类型要求,然后按如下方式进行转换:
class C: P {
let a: Immutable
init() {
a = Mutable()
(a as? Mutable)?.mutate()
}
}
这对我们来说并不理想,因为我们多次调用mutate()
,不想重构我们所有的代码。更改协议
p
以获得一个关联类型
,如下所示
protocol P {
associatedtype T: Immutable
var a: T { get set }
}
当您为符合p
的类中的变量a
赋值时,变量a
声明如上所述更改,以允许设置值
现在,您可以将一致性类中的类型定义为
class C: P {
var a: Mutable
init() {
self.a = Mutable()
self.a.mutate()
}
}
使可变
成为不可变
的子类似乎是一个概念问题。它们不应该有任何关联,因为这两个类实际上应该完全不同。一个类型应该是可变的或不可变的,<代码>易变的< /代码>不应该继承从<代码>不变的< /代码>。@ D·VIDP·SZOTR在Objul-C和Buffic的历史上是一个非常常见的模式。@提姆,这是Swift,而不是Obj-C:)Obj-C模式不应该盲目地带入SWIFT的世界,因为这两种语言在很多方面根本不同,所以它们是不同的语言。但不确定这一问题表明什么是一种盲目的模式。如果你对所问的问题有一个潜在的解决方案,那就去做吧,如果没有,这不是一个特别有用的贡献。@DávidPászor,只是从NSMutableParagraphStyle
和NSMutableString