创建枚举实例

时间:2018-01-03 13:10:19

标签: swift enums

假设我有

enum Example {
  case one(string: String)
  case two(string: String)
}

现在我有了

let x = Example.one(string: "Hello")

问题:

let y = ?

如何在e中创建同一枚举的另一个实例,以便我最终得到y == .one("World")

2 个答案:

答案 0 :(得分:1)

您可以像调用n一样调用初始化程序:

x

此外,您的枚举声明中的enum Example { case one(string: String) case two(string: String) } let x = Example.one(string: "Hello") print(x) // Prints one("Hello") let y = Example.one(string: "World") print(y) // Prints one("World") 错误,必须删除。

<强>更新

评论更详细地解释了这个问题,所以这是我更新的答案:

解决此问题的一种优雅方法是在原始枚举类型,上使用函数。

Example

答案 1 :(得分:0)

具有关联值的enum个案例的类型是具有与关联值的类型对应的参数的闭包,并且返回对应于enum的类型(返回的是特定的case)。即,对于上面的示例,Example.one以及Example.two类型(String) -> Example,其中由这两种情况表示的闭包产生不同的结果;分别为.one(...).two(...)实例

因此,不要将自己的方法写入&#34;克隆&#34;在给定的情况下,您可以简单地使用一个计算属性来返回已存在的闭包Example.oneExample.two(如果self分别是onetwo),这可以随后在String参数上调用以构造新的Example实例(值.one.two;以及提供的关联String值。

E.g:

enum Example {
    case one(string: String) // type: (String) -> Example
    case two(string: String) // type: (String) -> Example

    var caseClosure: (String) -> Example {
        switch self {
        case .one: return Example.one
        case .two: return Example.two
        }
    }
}

let x = Example.one(string: "Hello") // .one("Hello")
let y = x.caseClosure("World")       // .one("World")

但是,由于您示例中的所有情况都是相同类型的闭包,即(String) -> Example(即具有相同数量和类型的关联值),您也可以{{3} },在enum中包含struct一个没有关联值的String以及始终 - struct&#34;相关值&#34; struct S { enum E { case one case two } var e: E var string: String // Since "associated value" is always the same type init(_ e: E, string: String) { self.e = e self.string = string } init(from s: S, string: String) { self.e = s.e self.string = string } } let x = S(.one, string: "Hello") let y = S(from: x, string: "World") let z = S(x.e, string: "World") 的单独成员。例如。用一些初始化器扩展Hamish的例子:

 sassOptions: {
           includePaths: ['node_modules/material-components-web','node_modules/@material']      
    }