2017-08-23 45 views
13

TL;博士通用夫特4枚举与空相关联的类型

是否有可能实例的通用夫特4枚举成员与Void类型的相关值?

背景

我用一个简单的结果枚举(类似于antitypical Result):

enum Result<T> { 
    case success(T) 
    case error(Error?) 
} 

现在,我想利用这个枚举表示操作的结果这不会产生实际的结果值;该操作或者是成功失败。为此,我将该类型定义为Result<Void>,但我正在为如何创建Result实例而苦苦挣扎,let res: Result<Void> = .successlet res: Result<Void> = .success()都不起作用。

+0

你确定第二种方式吗?看起来像它的作品http://swift.sandbox.bluemix.net/#/repl/599d61b1b459cc41aee76d9d – pacification

+0

有趣的,谢谢你的例子。我重新检查了一下,但是在Xcode 9 Beta 5中,我得到了'调用参数#1缺少参数'。 –

+0

@Hamish:你可能是对的(我还在SE-0110和SE-0029 ... :) –

回答

28

在夫特3可以省略Void类型的相关联的值:

let res: Result<Void> = .success() 

在夫特4你必须通过Void类型的相关联的值:

let res: Result<Void> = .success(()) 
// Or just: 
let res = Result.success(()) 
+5

是否有一个不太难看的解决方案? –

+0

@RodrigoRuiz你可以定义一个扩展来摆脱'(())',[见我的回答](https://stackoverflow.com/a/46863180/2976878)。 – Hamish

3

空隙率为简单typealias空元组:(:)所以你可以使用它作为以下任何一个:

let res1: Result<Void> = .success(()) 
let res2 = Result<Void>.success(()) 
let res3 = Result.success(() as Void) 
let res4 = Result.success(()) 
10

在Swift 4中,具有Void关联值的枚举情况不再等同于具有空值关联值列表的枚举情况。

我相信这是,as Martin saysSE-0029结果在那里你可以不再传递的参数的元组的功能,并让他们“图示”穿越参数(虽然该提案被标注在斯威夫特3实现,我相信这个特殊情况在Swift 4的SE-0110的实现中稍后被采用)。

结果,这意味着你可以不再叫(Void) -> T作为斯威夫特4 () -> T现在,您必须通过Void中明确:

let result = Result.success(()) 

不过,我觉得这是很丑陋,所以我通常实行这样的扩展:

,它可以让你说这样的事情:

var result = Result.success 
result = .success 

值得注意的是,这种解决方法不仅仅局限于枚举情况,它还可以与一般的方法一起使用。例如:

struct Foo<T> { 
    func bar(_ a: T) {} 
} 

extension Foo where T == Void { 
    func bar() { bar(()) } 
} 

let f = Foo<Void>() 

// without extension: 
f.bar(()) 

// with extension: 
f.bar() 
+0

((Nice))。没有意识到你可以根据泛型的类型定义变量。 – GoldenJoe