正在忽略Swift枚举中的默认初始化

正在忽略Swift枚举中的默认初始化,swift,enums,optional,initializer,maybe,Swift,Enums,Optional,Initializer,Maybe,我正在尝试在Swift中重新实现可选。我叫它也许。我有两个init,用于创建空版本或nil版本以及一个包含泛型类型的版本: enum Maybe<T>{ case Nothing case Something(T) init(){ self = .Nothing } init(_ something: T){ self = .Something(something) } } 例如,Swift编译器

我正在尝试在Swift中重新实现
可选
。我叫它
也许
。我有两个init,用于创建空版本或nil版本以及一个包含泛型类型的版本:

enum Maybe<T>{
    case Nothing
    case Something(T)

    init(){
        self = .Nothing
    }

    init(_ something: T){
        self = .Something(something)
    }

}

例如,Swift编译器需要一些上下文来推断类型
T

var foo = Maybe<Int>()
var bar : Maybe<String> = Maybe()
这会打印
Some()
,并导致编译器警告

warning: variable 'x' inferred to have type 'Optional<()>', which may be unexpected
警告:变量“x”被推断为具有“可选”类型,这可能是意外的

看来你成功了。然而,我仍然不明白为什么编译器在缺少关于泛型类型的信息时,决定忽略第一个初始值设定项。。。有什么线索吗?@cfisher:我注意到,如果你有一个泛型函数使用一个参数
func foo(x:T){println(x)}
,那么你实际上可以调用
foo()
,得到与
foo(())
相同的结果。所以
var z=Maybe()
似乎被解释为
var z=Maybe(())
。但是我不知道这是故意的还是一个bug。@cfisher:我在开发者论坛上发布了一个问题,也许这提供了一些有用的信息。现在,如果不显式设置生成类型,swift 4将不会编译。
let x = Optional()
switch x {
case .None:
    println("None")
case .Some(let y):
    println("Some \(y)")
}
warning: variable 'x' inferred to have type 'Optional<()>', which may be unexpected