gpt4 book ai didi

swift - 使用协议(protocol)要求的子类

转载 作者:搜寻专家 更新时间:2023-11-01 05:31:32 24 4
gpt4 key购买 nike

我正在开发一个使用 MVVM 的项目,我们希望通过阻止调用者改变我们公开的对象来引入更多安全性。

我们不能将 Immutable 设为 struct 而只是将 mutate() 标记为 mutating,因为我们添加观察者,它以 Immutable 形式改变我们需要的对象。

这个例子展示了我们想做什么,但是我们只是得到一个错误,C 没有确认到 P 因为我们试图满足具有所需 ImmutableMutable

子类的协议(protocol)
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() 并且不想重构所有代码。

最佳答案

更改 protocol P 以具有如下所示的 associatedtype

protocol P {
associatedtype T: Immutable
var a: T { get set }
}

当您在 class 中为符合 P 的变量 a 赋值时,变量 a声明如上更改以允许设置值。

现在,您可以在符合要求的 class 中定义类型,

class C: P  {
var a: Mutable

init() {
self.a = Mutable()
self.a.mutate()
}
}

关于swift - 使用协议(protocol)要求的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com