类符合协议,函数接收泛型参数

时间:2021-03-24 20:16:36

标签: swift

我有两个数据结构,并且都符合协议 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) {
   }
}

这可能吗?

抱歉,如果这让我不知道该用什么谷歌搜索

1 个答案:

答案 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 的通用代码,那么这正是您想要的工具。