2

OptionalSwiftで再実装しようとしています。私はそれを呼んでいMaybeます。空またはnilバージョンとジェネリック型を保持するバージョンを作成するために、2つの初期化があります。

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

    init(){
        self = .Nothing
    }

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

}

ただし、空の を作成しようとするとMaybeinit()初期化子が呼び出されません。代わりに、もう一方init(_ something: T)は で呼び出されT = ()ます。

どうしたの?パラメータのない初期化が無視されるのはなぜですか?

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 に答える