假设我有
enum Example {
case one(string: String)
case two(string: String)
}
现在我有了
let x = Example.one(string: "Hello")
问题:
let y = ?
如何在e
中创建同一枚举的另一个实例,以便我最终得到y == .one("World")
)
答案 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.one
和Example.two
(如果self分别是one
或two
),这可以随后在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']
}