为什么这个递归Swift枚举挂起XCode



如果我在REPL、Playground或主项目中输入以下代码,当它试图创建空列表时,它就会挂起。

import Cocoa

public final class Box<T> {
    private let _value : () -> T
    public init(_ value : T) {
        self._value = { value }
    }
    public var value: T {
        return _value()
    }
}
public enum List<U> {
    case Empty
    case Cons(U, Box<List<U>>)
}
var l = List<Int>.Empty;

我知道这是一种流行的技术,用来绕过Swift不让枚举在没有一些间接性的情况下真正递归的事实(在本例中由Box类提供)。

我的意思是,这是在这个项目中完成的,所以我认为这对一些人有效。

我卸载并重新安装了XCode,不知怎么的,我觉得以前的测试版留下了一些"坏东西"。其他人有这个问题吗?

2015年11月17日更新:当然,这个问题和答案现在已经过时了。请参阅如何在此处定义递归枚举:Swift编程语言-枚举

正在与某人合作,他们解决了这个问题。

https://github.com/typelift/swiftz/issues/114

https://github.com/typelift/swiftz/pull/120

答案是把Cons的第一个参数也框起来(你可以使用自动关闭),就像这个Cons(@autoclosure () -> U, Box<List<U>>)一样,这会解决它。

最新更新