多个枚举实现协议问题

2024-04-10

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

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. 对于具有字符串数据类型的枚举,我想避免重复生成变量名:var name: String我不知道如何用 Swift 编写它。我尝试使用“where”子句但没有成功。我怎样才能做到这一点?

  2. 当我编写枚举并遵守该部分的协议时: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(使用前将#替换为@)

多个枚举实现协议问题 的相关文章

随机推荐

  • 如何快速禁用和启用自动旋转?

    在一般设置中 我允许纵向和横向左 横向右模式 我想关闭横向模式 在 viewController 上我写了这段代码 override func shouldAutorotate gt Bool return false 但是 自动旋转会忽略
  • 如何通过 Facebook Graph Api 获取用户的朋友在生日当天在用户墙上发布的帖子?

    我正在尝试构建一个 Chrome 扩展程序 我想获取人们专门在用户生日那天发布在用户墙上的所有帖子 我尝试通过 Facebook Javascript SDK 进行调用 但它没有返回我的朋友在生日那天发布的帖子 FB api me feed
  • 使用 Owin.Testing 时获取远程 ip

    我使用 Owin Testing 作为测试环境 在我的控制器中 我需要从调用者那里获取远程 IP 地址 in my controller method var ip GetIp Request Util private string Get
  • Java mp4parser片段序列不连续性

    此用例是一项服务 手动将一系列未压缩的 wav 媒体片段编码为 m4s 片段 以便通过 MPEG DASH 广播 使用 ffmpeg 将 wav 压缩为 aac 并使用 sannies mp4parser 将 aac 音频组装为 m4s 片
  • Mocha 如何知道在测试套件中首先加载哪个文件

    我正在尝试学习 MongodB 的测试驱动方法 文件夹结构 A user js在src文件夹中测试 const mongoose require mongoose mongoose Promise require bluebird cons
  • 异常信息:System.Reflection.TargetInitationException

    我正在开发 WPF 应用程序 仅在单个设备上运行时收到此错误 Exception Info System Reflection TargetInvocationException 我的问题 有什么线索可能导致此错误吗 知道如何在发布模式下调
  • 核心数据同步

    有没有办法自动将我的核心数据模型与服务器同步 最好是 REST Thanks 苹果已经分享了他们的同步服务框架 记录如下 http developer apple com documentation Cocoa Conceptual Syn
  • 了解 C++ 内存模型:不同运行时的不同值

    下面的代码有什么问题 我预计消费者 1 和消费者 2 会生成 10 个 但有时会看到 1 include
  • 画布和输入映射

    我正在用 Java 构建一个 2d 游戏 我决定使用 Canvas 在上面显示与当前帧相关的图像 我使用 Canvas 是因为我听说它在时间方面比 JPanel 更高效 这是真的吗 另外 我想通过以下方式向游戏添加一些输入键绑定因为关键听众
  • 在迭代器上使用 map()

    假设我们有一张地图 let m new Map using m values 返回一个地图迭代器 但我不能使用forEach or map 在该迭代器上并在该迭代器上实现 while 循环似乎是一种反模式 因为 ES6 提供了类似的函数ma
  • 如何使用 Caliburn.Micro 将源 MediaCapture 绑定到 CaptureElement?

    在 Windows Phone 8 1 上 我使用 Caliburn Micro 视图模型优先方法 但由于视图模型无法了解视图的任何信息 因此我看不到如何将 MediaCapture 对象绑定到视图中的 CaptureElement 我有同
  • Flutter pub get 执行时间太长

    当在 Vscode 中运行新应用程序 flutter pub get 时 它会持续运行但未完成 我尝试过 flutter clean 然后重新打开 vscode Try 扑干净命令 同时删除pubspec lock然后将文件放在根目录中re
  • 使用 Python/(GAE) 为 Android 应用程序推送通知的服务器端实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 从哪里 有用的链接 开始 我需要基础
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • “扁平比嵌套更好”——对于数据和代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 This https stackoverflow com questions 4372073 traversing and modifying
  • s3fs 将 Amazon S3 存储桶挂载为本地目录的稳定性如何 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 s3fs 在 Linux 中将 Amazon S3 存储桶挂载为本地目录的稳定性如何 对于高要求的生产环境是否推荐 稳定 有更好 类似的解决方案
  • 更改 Firefox 拼写检查默认语言

    Firefox 开始相信我的默认拼写检查语言应该是西班牙语 我的全球偏好选择了英语 首选项 gt 内容 gt 语言 gt 英语 en 我可以通过以下方式逐页重置拼写检查器语言 右键单击 gt 语言 gt 英语 美国 但是 对于新打开的页面或
  • 如何修复 Jackson java 8 数据/时间错误?

    Java 8 date time type java time LocalDateTime not supported by default add Module com fasterxml jackson datatype jackson
  • 无法在管道中多次检出同一存储库

    我在多个环境中拥有自托管代理 我试图在这些环境上运行相同的构建 部署进程 我希望能够将相同的代码从单个存储库同时部署到多个系统 因此 我创建了一个 开销 管道和几个 流程 管道模板 一切似乎都进展顺利 除了当我尝试在同一管道执行中两次执行同
  • 多个枚举实现协议问题

    我将枚举定义为确认协议可事件 protocol Eventable var name String get static var all Eventable get enum MyEnum String Eventable case bla