2

我正在尝试Optional在 Swift 中重新实现。我正在调用它Maybe。我有 2 个 init,用于创建空版本或 nil 版本,一个拥有泛型类型:

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

    init(){
        self = .Nothing
    }

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

}

但是,当我尝试创建一个 emptyMaybe时,init()不会调用初始化程序。相反,另一个init(_ something: T)是用 调用的T = ()

这是怎么回事?为什么没有参数的init被忽略?

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

1 回答 1

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
于 2014-10-11T12:31:51.293 回答