Swift枚举中的默认init被忽略

时间:2014-10-11 12:20:45

标签: swift enums optional initializer maybe

我试图在Swift中重新实现Optional。我称之为Maybe。我有2个inits,创建空或nil版本和一个持有泛型类型:

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

    init(){
        self = .Nothing
    }

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

}

但是,当我尝试创建一个空的Maybe时,不会调用init()初始值设定项。而是使用init(_ something: T)调用另一个T = ()

发生了什么?为什么没有参数的init被忽略?

var z = Maybe() // this calls init(_ something: T) with T = ()

1 个答案:

答案 0 :(得分:1)

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

var foo = Maybe<Int>()
var bar : Maybe<String> = Maybe()

会出现同样的问题
let x = Optional()
switch x {
case .None:
    println("None")
case .Some(let y):
    println("Some \(y)")
}

打印Some ()并导致编译器警告

warning: variable 'x' inferred to have type 'Optional<()>', which may be unexpected