【发布时间】:2021-05-27 02:31:22
【问题描述】:
目标
创建具有以下行为的“AutoIDable”协议。
- 符合此协议的类的每个实例都将获得一个自动生成的字符串类型的“id”属性。
- 代码应生成格式为
<prefix><Instance-count-starting-from-1>的id 字符串(例如:E-1、E-2、...E-<n>等等,用于符合类的第一个、第二个...第 n 个实例。 - 协议和协议扩展应该所有完成生成id字符串所需的工作。符合标准的类只需订阅协议即可。
当前状态:
我通过以下实现实现了目标 1 和目标 2:
protocol Identifiable {
var id: String { get }
}
protocol AutoIDable: Identifiable{
static var _instanceCount: Int { get set }
}
class AutoID: AutoIDable {
init(idPrefix: String) {
setAutoID(prefix: idPrefix)
}
internal static var _instanceCount: Int = 0
var id: String = ""
func setAutoID(prefix: String = ""){
Self._instanceCount += 1
self.id = "\(prefix)\(Self._instanceCount)"
}
}
class Employee: AutoID {
init(){
super.init(idPrefix: "E-")
}
}
let e1 = Employee()
let e2 = Employee()
let e3 = Employee()
print(e1.id)
print(e2.id)
print(e3.id)
print(e1.id)
运行上述代码的输出:
E-1
E-2
E-3
E-1
待办事项:
为了实现目标 3,我需要消除 AutoID 超类并使用协议扩展实现相同的功能。
我遇到了麻烦,因为:
- 协议扩展不允许静态存储属性。我确实知道如何在不使用超类的情况下解决此限制。
- 我不知道如何将代码注入到 Employee 类的创建者可能创建的所有初始化程序中。同样,我想不出不使用超类的解决方法。
如果您能指出正确的方向,我将不胜感激。
PS:Swift 编程新手。如果您对以更“迅速”的方式实现代码有任何建议,请告诉我。 :-)
【问题讨论】:
-
这是不可能的。协议不应该添加存储属性。这不是他们的设计目的(我想也有技术原因)。您应该继续使用您的超类,或者在每个符合要求的类中添加该属性声明。
标签: swift swift-protocols