swift - 聚合一系列 swift 类型
问题描述
在 Swift 中,我知道类型本身就是类,但我很难做到这一点。
我正在尝试创建一个“工厂”,其中我有一个Array
类型,每个类型都符合一个协议(因此它实际上是一个Array
协议),它指定了一个静态“工厂”函数。
这将允许我将一组类与一个实例相关联,以便该实例可以循环通过“工厂”并实例化与该实例相关联的类。
这就是我的意思:
protocol A {
static func makeAStat() -> A
func makeADyn() -> A
}
struct APrime: A {
static func makeAStat() -> A {
return Self()
}
func makeADyn() -> A {
return Self.makeAStat()
}
}
let instanceOne = APrime.makeAStat()
let instanceTwo = APrime().makeADyn()
let arrayOf1 = [APrime()]
let instance3 = arrayOf1[0].makeADyn()
//let arrayOf2: [A.Type] = [APrime]
//let instance4 = arrayOf2[0].makeAStat()
注意两个注释掉的行。他们会破坏操场,但我想让类似的东西工作,所以我可以说“这是一个 WidgetPlus 对象,所以它可以从这三种类型中选择作为处理程序”。
有没有人对我实现这一目标的最佳方式提出建议?
解决方案
只需添加.self
let arrayOf2: [A.Type] = [APrime.self]
let instance4 = arrayOf2[0].makeAStat()
为了更清楚,我建议写
protocol A {
static func makeAStat() -> Self
func makeADyn() -> Self
}
struct APrime: A {
static func makeAStat() -> APrime {
return APrime()
}
func makeADyn() -> APrime {
return APrime.makeAStat()
}
}
推荐阅读
- c# - 如何让我的图表网格为白色?
- python - 如何在 kivy 代码中使用keyboard_on_key_down 函数?
- typescript - 如何从包中自动克隆接口?
- html - 添加不同的超链接
使用 XSLT 将 XML 中的标签转换为 HTML - javascript - Mongoose:随着新用户自动增加和减少数字
- vuedraggable - Vue.Draggable:从多个组拖到一个目标组
- delphi - 如何在运行时计算 TCategoryButtons 的高度?
- java - 为什么 Android Studio 中的“TextInputEditText 无法转换为 TextInputLayout”?
- pyarrow - 如何将 pyarrow.Table 列数据转换为表格、行状数据
- javascript - Javascript函数变量双管道符号