【问题标题】:Unwrapping associated value for all cases in switch为 switch 中的所有情况展开关联值
【发布时间】:2019-08-15 07:49:39
【问题描述】:

我有一个与此类似的枚举,其中所有案例都包含相同的关联值content

enum RowType {
    case single(_ content: [Any])
    case double(_ content: [Any])
    case triple(_ content: [Any])
    ...
}

我知道我可以将structrowTypecontent 属性一起使用,但请不要讨论这个问题,而是看看以下内容: 当我想切换所有情况时,我当然可以这样做:

switch row {
case .single(let content):
    // do anything
    break
case .double(let content):
    // ...
...
}

甚至:

switch row {
case .single(let content), .double(let content), ...:
    // do the same thing for all cases
    break
}

现在我的枚举包含更多案例,并且在开发过程中可能会进一步增长,因此我不方便在同一个 case 语句中列出所有案例,只是为了打开 content 参数。

所以我很好奇并想知道:我能否以某种方式“通配符”枚举案例本身并仍然解开 content 字段?就像具有关联值的 default 案例... p>

我希望能够做到类似 ...

switch row {
case _(let content):
    // do something
    break
}

...或者可能在默认情况下访问关联的值。

我做了一些研究,但找不到答案,所以我很期待你的想法。

【问题讨论】:

  • 不存在这样的功能。使用带有 rowType 和 content 属性的结构将是正确的方法。
  • 一种可能的解决方案是向您的枚举添加一个计算属性,该属性包含一个开关,然后返回您的。内容。您仍然需要包含所有可能性,但只需包含一次。
  • 现在不可能,即使每个案例都可能包含不同类型的关联值(或根本没有),并且编译器无法使用单个通配符处理所有这些值
  • @MichaelSalmon 嗯,这实际上是个好主意!感谢分享!
  • @RicoCrescenzio 是的,它可以,但我不能告诉他依靠它,比如强制解开枚举值吗?类似于“每当我可以打开类型为 [Any] 的关联值”的情况。我的意思是,它仍然是一个提供默认子句作为后备的开关......你知道我的意思吗?

标签: swift xcode switch-statement associated-value


【解决方案1】:

在 Playground 中试试这个。

enum RowType {
case single(_ content: [Any])
case double(_ content: [Any])
case triple(_ content: [Any])
case noVal

var associatedValue: Any? {
    get {
        let mirror = Mirror(reflecting: self)
        if let associated = mirror.children.first {
            return  associated.value
        }
        print("WARNING: Enum option of \(self) does not have an associated value")
        return  nil
    }
  }
}

let row : RowType = .double([1,2,3])
let rowNoVal : RowType = .noVal
row.associatedValue
rowNoVal.associatedValue

【讨论】:

  • 其实挺好用的,谢谢分享!你能想到一个“更安全”的变体,例如没有 Mirror 吗?
  • 我正在寻找没有 Mirror 的更安全的变体,@Muli。 (您可以通过我的问答在这里看到。)这是尝试做到这一点stackoverflow.com/questions/55212028/… 请注意,在静态情况下,rawValues 可以代替。
  • 否则我只能想出这么直接的解决方案,@Muli:var associatedValue: Any? { get { switch self { case .single(let content), .double(let content), .triple(let content): return content default: return nil } } } }
  • 是的,看起来不错!此外,您的直接解决方案似乎是一个不错的解决方法。谢谢
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多