2016-08-13 4 views
2

に無記号-合体演算子を適用するときにエラーを誘発しないゼロ・合体オペレータは(?? B)それは値が含まれている場合optianl aをアンラップするか、またはデフォルトを返しますaがnilの場合は値b。式aは、常にオプションの型です。なしオプション可変

無記号-合体演算子は

!= nilを以下のコードの省略形ですか? a!コンパイラはANを与えていないのはなぜ

bを私はその後

//First 
let a: Int = 3, b: Int = 4 
a ?? b // No error 

&

//Second 
let a: Int = 3, b: Int = 4 
a != nil ? a! : b //Triggers an error: value of type 'int' can never be nil, comparison isn't allowed 

質問次のテストコードスニペットを試してみました最初のコードスニペットでエラーが発生しました2番目のエラー?彼らは同じではありませんか?

感謝

enter image description here

enter image description here

答えて

1

ゼロ-合体オペレータ

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

第一オペランド任意とります。従ってa ?? ba != nil ? a! : bは同等であり、aはオプションです。

最初のオペランドaはオプションではありませんあなたの例では

let a: Int = 3, b: Int = 4 
a ?? b 

場合ではありません。ただし、コンパイラは は、任意の値TをオプションのT?に「ラップ」して、関数または演算子と一致するように の順に並べ替えることができます。例えば、

func foo(x: Int?) { } 
foo(3) 

に引数3Int?に包まれています。あなたのケースでは

は、式が

Optional<Int>.Some(a) != nil ? Optional<Int>.Some(a)! : b 

と同等です

Optional<Int>.Some(a) ?? b 

と同等であることただし、コンパイラは Optional<Int>.Some(a)nilすることができないことを認識するようにスマートではありません。

関連する問題