gpt4 book ai didi

Swift 类不符合带有枚举的协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 10:06:12 25 4
gpt4 key购买 nike

嘿,我正在尝试构建一个基类来执行某些在应用程序中重复的操作,但我遇到了一个我无法真正理解的问题,以下代码举例说明了我正在尝试的操作构建:

protocol GenericSection { }
protocol GenericRow { }

protocol GenericModel {
var section: GenericSection { get }
var items: [GenericRow] { get }
}

protocol GenericVM {
var model: [GenericModel] { get set }
}

class ExampleVM: GenericVM {

enum Row: GenericRow {
case aRow
}

enum Section: GenericSection {
case aSection
}

struct Model: GenericModel {
let section: Section
let items: [Row]
}

var model: [Model] = []
}

这不会编译,因为 Model不符合 GenericModelExampleVM不符合 GenericVM .

解决这个问题的方法是使用 GenericRow , GenericSectionGenericModel ,我的问题是为什么我不能使用相应的 Row , SectionModel符合这些协议(protocol)。

最佳答案

问题是,当你在协议(protocol)定义中声明具体类型要求时,你不能使用子类(或者如果声明的类型要求是协议(protocol)类型,则符合协议(protocol)的类型),你需要使用实际的(协议(protocol)) 输入一致的类。

这是您看到的继承行为。您不能通过使属性的类型成为父类(super class)中声明的类型的子类来覆盖继承的属性。当使用父类(super class)类型/协议(protocol)类型来表示子类/符合类时,这会导致意外行为。

您可以通过使用关联类型使您的协议(protocol)通用来解决这个问题。

protocol GenericSection { }
protocol GenericRow { }

protocol GenericModel {
associatedtype Section:GenericSection
associatedtype Row: GenericRow

var section: Section { get }
var items: [Row] { get }
}

protocol GenericVM {
associatedtype Model: GenericModel
var model: [Model] { get set }
}

class ExampleVM: GenericVM {

enum Row: GenericRow {
case aRow
}

enum Section: GenericSection {
case aSection
}

struct Model: GenericModel {
let section: Section
let items: [Row]
}

var model: [Model] = []
}

关于Swift 类不符合带有枚举的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53209077/

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