我试图在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 = ()
答案 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