我将枚举定义为确认协议可事件:
protocol Eventable {
var name: String { get }
static var all: [Eventable] { get }
}
enum MyEnum: String, Eventable {
case bla = "bla"
case blu = "blu"
var name: String {
return self.rawValue
}
static var all: [Eventable] {
return [
MyEnum.bla,
MyEnum.blu
]
}
}
我还有其他枚举,例如 MyEnum ,其形式也如下:
枚举 Bla:字符串,可事件 {
}
我有两个问题:
对于具有字符串数据类型的枚举,我想避免重复生成变量名:var name: String
我不知道如何用 Swift 编写它。我尝试使用“where”子句但没有成功。我怎样才能做到这一点?
当我编写枚举并遵守该部分的协议时:static var all: [Eventable] { get }
。
我希望对于枚举 MyEnum,它将变量限制为:static var all: [MyEnum] { ... }
因为现在我可以在返回的数组中放入任何可事件元素,但这不是我需要的。
除此之外,我尝试在协议中为其定义通用约束,但出现以下错误:
协议“Eventable”只能用作通用约束,因为
它有自身或相关类型要求
非常感谢你的帮助!
对于你的第二个问题,你只需要使用Self
:
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
Self
, 如同self
,仅表示“当前类型”。
第一个问题有点难,因为您无法真正安全地获取枚举的所有值。看here https://stackoverflow.com/questions/32952248/get-all-enum-values-as-an-array了解更多信息。我得到的最接近的是:
extension Eventable where Self: RawRepresentable, Self.RawValue == String {
var name: String {
return self.rawValue
}
}
这意味着您可以省略声明name
in MyEnum
, 但不是all
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)