swift - 多个枚举实现协议(protocol)问题

标签 swift enums protocols

我将枚举定义为确认协议(protocol)可事件:

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:字符串,可事件 { }

我有两个问题:

  1. 对于具有字符串数据类型的枚举,我想避免重复生成变量名称: 变量名称:字符串 我不知道如何用 Swift 编写它。我尝试使用“where”子句但没有成功。我怎样才能实现这一目标?

  2. 当我编写枚举并遵守该部分的协议(protocol)时: static var all: [Eventable] { get }。 我希望对于枚举 MyEnum,它将变量限制为: static var all: [MyEnum] { ... } 因为现在我可以在返回的数组中放入任何可事件元素,但这不是我需要的。 除此之外,我尝试在协议(protocol)中为其定义通用约束,但出现以下错误:

Protocol 'Eventable' can only be used as a generic constraint because it has Self or associated type requirements

非常感谢您的帮助!

最佳答案

对于你的第二个问题,你只需要使用Self:

protocol Eventable {
    var name: String { get }
    static var all: [Self] { get }
}

Self,与self类似,只是表示“当前类型”。

第一个问题有点难,因为你无法真正安全地获取枚举的所有值。请参阅here了解更多信息。我得到的最接近的是:

extension Eventable where Self: RawRepresentable, Self.RawValue == String {
    var name: String {
        return self.rawValue
    }
}

这意味着您可以省略 MyEnum 中的 name 声明,但不能省略 all

关于swift - 多个枚举实现协议(protocol)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47269528/

相关文章:

ios - 全局更改 UINavigationBar 条形色调颜色

swift - 有没有办法在 swiftUi 的安全文本字段中添加 onEditingChanged?

java - 枚举返回语句

iphone - 委托(delegate)和协议(protocol)无法正常工作

ios - NSURLProtocol canInitWithRequest 调用 5 次

iOS登录/自动登录和注销流程

ios - 确定 JSON 中的 "nil"值

java - Java 中的枚举有什么用?

mysql - ENUM 值的最大长度是多少?

javascript - 将架构协议(protocol)更改为 http ://in WebView Android