Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用协议需求的子类_Swift_Polymorphism_Protocols_Subclassing - Fatal编程技术网

Swift 使用协议需求的子类

Swift 使用协议需求的子类,swift,polymorphism,protocols,subclassing,Swift,Polymorphism,Protocols,Subclassing,我正在从事一个使用MVVM的项目,我们希望通过阻止调用方改变我们公开的对象来引入更多的安全性 我们不能使不可变成为结构,而只是将mutate()标记为mutating,因为我们添加了观察者,使不可变表单中所需的对象发生变异 这个例子显示了我们想要做的事情,但是我们只得到了一个错误,C不能确认为p,因为我们试图用所需的不可变,可变的子类来满足协议 class Immutable {} class Mutable: Immutable { func mutate() {} } ​ prot

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

我们不能使
不可变
成为
结构
,而只是将
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