如何快速创建通用关联类型协议的数组?

阿努普·拉瓦特(Anoop Rawat)

最好举个例子。所以它的表部分和行

首先创建一个协议,该协议必须由具有关联类型的所有行实现,必须由调用方提供以在定义行时告知。

protocol RowElementProtocol {
    associatedtype ElementType
    var cellIdentifier: String {get set}
    var cellType: ElementType {get set}
}

所以在这里创建一个通用的行结构

struct GenericRow <T>: RowElementProtocol {

    var cellIdentifier = "cell"
    var cellType: T

    /// Some Other Properties

    init(cellIdentifier: String = "cell", cellType: T) {

        self.cellIdentifier = cellIdentifier
        self.cellType = cellType
    }
}

在这里创建一个不同的行结构

struct DifferentRow<T>: RowElementProtocol {

    var cellIdentifier = "cell"
    var cellType: T

    /// Some Different Properties other then generic
}

现在创建一个可以包含任何行的节

struct Section<T: RowElementProtocol> {

    var rows = 1
    var rowElements: [T]
}

一切都很好,当我要初始化一个数组部分时出现问题

let sections = [Section<T: RowElementProtocol>]()

编译器不允许我初始化。其显示的“>'不是后缀一元运算符”。

清扫器

让我们看一下允许您创建此类数组的编译器的结果。

您可以执行以下操作:

var sections = [Section<T: RowElementProtocol>]()
var sec1 = Section<GenericRow<String>>()
var sec2 = Section<DifferentRow<Int>>()
sections.append(sec1)
sections.append(sec2)
let foo = sections[0] // how can the compiler know what type this is?

现在看到问题了吗?您可能会说:“好吧,foo可以只是类型Section<T: RowElementProtocol>。” 好吧,让我们假设这是真的:

foo.rowElements[0].cellType // what the heck is the type of this?

编译器不知道。它只知道foo.rowElements[0]“符合某种类型,RowElementProtocolcellType可以是任何类型。

“好吧,为什么不只使用Any那种类型呢?” 你可能会问。编译器可以做到这一点,但这使您的泛型毫无意义,不是吗?

如果您想让泛型毫无意义,可以通过创建类型AnyRowElement来进行所谓的“类型擦除” AnySection

struct AnyRowElement : RowElementProtocol {
    var cellIdentifier: String

    var cellType: Any

    typealias ElementType = Any

    init<T: RowElementProtocol>(_ x: T) {
        self.cellIdentifier = x.cellIdentifier
        self.cellType = x.cellType
    }
}

struct AnySection {
    var rows: Int
    var rowElements: [AnyRowElement]

    init<T: RowElementProtocol>(_ x: Section<T>) {
        self.rows = x.rows
        self.rowElements = x.rowElements.map(AnyRowElement.init)
    }
}

let sections: [AnySection] = [AnySection(sec1), AnySection(sec2)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何快速创建依赖的通用协议

快速的类型协议数组

如何在Swift中将具有关联类型的协议(通用协议)作为参数传递?

Swift 4:以协议作为关联类型的通用协议的实现

如何实现具有使用关联类型类型的功能的通用协议?

如何快速从协议返回类型

如何使用具有关联类型的协议初始化通用枚举?

使用具有协议和关联类型的通用类型?

数组中的Swift通用协议类类型

快速使用通用协议

快速通用协议

符合通用协议且关联类型也是协议的结构的类型

创建类的通用类型的数组

符合具有关联类型的协议的枚举类型数组

如何创建通用数组?

如何快速创建一个 Result 类型的数组?

如何在Swift中创建通用协议?

如何实现符合相互关联的协议之一的通用类?

协议关联类型和<>

如何在使用关联类型的协议中使用类型擦除

如何要求通用类型使用协议中的特定类型来实现通用协议

与相关类型的快速协议

快速将协议用作数组类型和函数参数

如何创建快速通用的可变参数函数?

为什么协议的关联类型在Swift中不使用通用类型语法?

无法将协议的通用关联类型的值转换为预期的参数类型

如何快速声明数组类型

如何使用2个Swift协议创建观察者模式,其中两个关联类型必须相同?

是否可以在Swift中使用Self或关联的类型要求创建通用的计算属性,如果可以,如何创建?