我有两个数据结构,并且都符合协议 CellDataType
:
enum CellType {
case picture
case text
}
protocol CellDataType {
var type: CellType { get }
}
struct PictureData: CellDataType {
var type: CellType = .picture
let image: UIImage
}
struct TextData: CellDataType {
var type: CellType = .picture
let text: String
}
我想要做的是有多个类符合接收此数据类型的协议,然后通过使用特定数据到该单元格来符合协议,如下所示:
protocol VariableCell {
func setUp<T: CellDataType>(cellData: T)
}
class PictureCell: VariableCell {
func setUp(cellData: PictureData) {
}
}
class TextCell: VariableCell {
func setUp(cellData: TextData) {
}
}
这可能吗?
抱歉,如果这让我不知道该用什么谷歌搜索
答案 0 :(得分:1)
您编写的代码可能不正确,因为 VariableCell 要求 any CellDataType 可以传递给 setUp
,但是 PictureCell 只允许传递一种特定类型。如果您将一个 VariableCell 传递给一个函数,那么它必须传递给 setUp
什么?
但是,如果您真的想通过设置 T == PictureData
(而不是通过 VaraibleCell 接受所有可能的 T)来表示 PictureCell 符合 VariableCell,那么这正是关联类型的用途:
protocol VariableCell {
associatedType CellData: CellDataType
func setUp(cellData: CellData)
}
class PictureCell: VariableCell {
func setUp(cellData: PictureData) {
}
}
class TextCell: VariableCell {
func setUp(cellData: TextData) {
}
}
一旦你这样做了,你就不能再将 VariableCell 用作普通类型。例如,您不能拥有 [VariableCell]
,因为您将无法遍历它们并调用 setUp
(如果类型可以不同,您会传递什么)?但假设您打算构建依赖于 VariableCell 的通用代码,那么这正是您想要的工具。