2016-04-27 11 views
3

オペレータが暗黙的にアンラップされたオプションを返す理由はありません。しかし、暗黙的にラップされていない任意のデフォルト値をオプションの(ラップされた)ラップにラップする点は何ですか?私はちょうど非オプションの結果を期待するだろう。私は何とかここで間違っていると思いますか?なぜnil合体演算子は、暗黙的にラップされていないデフォルト値をラップしますか?

var defaultValue: Int! = 0 
var optional: Int? 

let result = optional ?? defaultValue 

print(defaultValue.dynamicType) // ImplicitlyUnwrappedOptional<Int> 
print(result.dynamicType) // Optional<Int> 
+1

ここで興味深い点は、IUOが暗黙的にアンラップされない状況があることです。パターンマッチングは別の例です。 –

答えて

5

nil合体演算子が宣言されているSwiftモジュールを調べます。第2オペランドは非オプションである場合(あなたはスウィフトのタイプを推測させた場合)??は、明示的にオプションを返します。

@warn_unused_result 
public func ??<T>(optional: T?, @autoclosure defaultValue:() throws -> T?) rethrows -> T? 

@warn_unused_result 
public func ??<T>(optional: T?, @autoclosure defaultValue:() throws -> T) rethrows -> T 


let val1: Int? = nil 
let val2 = 1 
let val3 = val1 ?? val2 // 1 

val3.dynamicType // Int.Type 
+0

右...私はこれらを見つめていましたが、それを逃しました... –

+2

なぜnil coalescing演算子を非任意の値で使うのですか? val2は決して使用されません –

+0

多分あなたは意味しました: "第2オペランドが非オプションです.."? –

3

問題は単なる推測されたタイプの一つです。スイフトがここでタイプを推測させてはいけません。これを書いてください:

let result : Int = optional ?? defaultValue 

あなたは期待した結果を得るでしょう。

+1

良いポイントマット。答えは分かりませんが、すてきです。 –

+0

それはあなたが答えたいものによって異なります。 JALはその現象を正しく説明しました。私のアプローチは実用的でした。私は期待された答えを得て、人生で乗りたいと思っていました。 :) – matt

+0

代わりに、 'let result = optional ?? defaultValue as Int' – vacawama

関連する問題