【问题标题】:How to declare an `enum` of `enum` that allows for "flattened" `switch` statement?如何声明允许“扁平化”“switch”语句的“enum”的“enum”?
【发布时间】:2021-12-09 19:13:57
【问题描述】:

Swift 中的Optional 允许使用switch-ing 覆盖可选的enum 的魔术,将案例扁平化为单个switch 语句。

给定:

enum Foo {
    case bar, baz
}

你可以:

let foo: Foo? = .bar
switch foo {
case .bar:
    break
case .baz:
    break
case nil:
    break

这里,OptionalenumFooenum,但只需一条语句就足以涵盖这两种情况。

问题:我可以在另一个enum 中声明我自己的enum,这样案件也可以以扁平方式处理吗?

这样我可以:

enum Foo<Bar> {
    case nope
    case dope(Bar)
}

enum Baz {
    case yep
}

let b: Foo<Baz> = .dope(.yep)

switch b {
case .nope:
    break
case .yep:
    break
}

如果我将案例Foo.dope 称为Foo.some,也许可以?也许有我可以使用的注释?

【问题讨论】:

  • 我想知道当你不使用泛型时它是否真的有效......

标签: swift enums switch-statement optional associated-value


【解决方案1】:

你可以这样做……

switch b {
case .nope: // stuff
case .dope(.yep): // other stuff
case .dope(.someOtherCase): // more stuff
}

回复您的评论…

想象一下你可以像你说的那样把它弄平。你会怎么处理……

enum Foo {
    case a
    case b(Bar)
    case c(Bar)
}

如果允许您从开关中排除.b,则无法区分.b.c

【讨论】:

  • 是的,我的意思是,好吧,是的,butttttt----我想知道我是否可以完全摆脱开关内部的.dope... :)
  • 我设法让我自己的枚举尽可能地允许它使用nil 和直接在开关中的包装值。但它仍然需要我添加.no 才能使开关详尽无遗。我几乎用我之前发送的可选链接中的所有代码创建了自己的 Foo 枚举。在使用nil 时,我找不到任何关于他们如何设法从交换机中删除.none 要求的信息。我仍然会争辩说,当您仍然可以通过使用 .dope(.yes) 作为模式“压平”开关时,您正在尝试的可能太多而收益太少。
  • 该死,现在我对自己的工作原理很感兴趣。哈哈!我创建了一个要点来显示我要去哪里...gist.github.com/oliverfoggin/697e9340a5705800adf6ec5ae4cac29d 但无法使某些功能正常工作。我添加了一个快速论坛问题forums.swift.org/t/…
  • 好吧……这是来自一位前苹果工程师……twitter.com/txaiwieser/status/1452379958219788299?s=20 Optional 做所有这些花哨的东西的方式是,他们在编译器中加入了很多东西,以便编译器给它这些“你所说的魔力”。所以,至于自己写,你肯定无法自己复制所有内容。
  • 别担心,伙计。一切都很好?我实际上对它的工作原理非常感兴趣。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
相关资源
最近更新 更多