2017-11-17 19 views
0

にExpressibleByNilLiteralに準拠し、私はのように定義列挙型があります:nilのことで、それが表現できるようにするにはジェネリック列挙型は、迅速

enum Context<T> { 
    case some(T) 
    case error(Error) 
    case none 
} 

を、私はこの拡張機能を作成しました:

extension Context: ExpressibleByNilLiteral { 
    init(nilLiteral:()) { 
     self = .none 
    } 
} 

それから私は別のクラスを持っていますそれは引数として取るべきメソッドを公開します:

func start<T>(context: Context<T>) 

私はそれを使用してみようとするとnil文脈として、コンパイラは次のようなエラーを表示します:

私はすでにそれについていくつかの回答を見ましたが、うまくいかないようです。
私はそれができないか、私がそれを間違ってやっているのか分かりません。

答えて

2

タイプ推論者はTを決定する必要があります。それはnil(またはそれに関しては.none)を単独で見るか、どのタイプを選ぶべきかを見ることからそうすることはできません。

Tをコンク​​リートにする必要があります。

start(context: nil as Context<Int>) 

注意することによって、再び問題が全くExpressibleByNilLiteralではないので、.noneを渡すと同じ問題を持っていること。

Tを実際に使用するには、他のパラメータや戻り値を使用することもできます。たとえば、あなたが機能そして

func get<T>(context: Context<T>) throws -> T? 

完全によく

let v: Int? = get(context: nil) 

仕事のようなラインを持っている場合。


サイドノート:なぜ.noneの別名としてリテラルnilを使うのか?後者を使用すると、コードを読み取っている間の混乱を避けることができます。let v: Context<Int> = nilは、一目ぼれ、Swiftが無効です。

+0

これは意味があります、ありがとう – Andrea

関連する問題