2016-08-25 5 views
1

変数aに単一の疑問符の代わりに二重疑問符を付けるとXcodeのプレイグラウンドがnilを返す理由を誰にでも教えてもらえますか? オーバーフローのため、結果は64でなくてはなりません。スワイプのNil合体オペレータが奇妙な結果を返す

スイフトバージョン2.2、 Xcodeのバージョン7.3.1、 OS Xバージョン10.11.6

import Cocoa 

    var b: Int8 
    var c: String? = "128" 
    var a: Int8?? = Int8(c!) 

    b = 64 

    func nilCoalescing() { 
     a != nil ? a! : b 
    } 

    nilCoalescing() 
+5

関数は何も返しません。どこでもnil coalescing operatorを使用していません。 –

+0

しかし、var a:Int8? = Int8(c!)それは64を返します。 –

+1

これは、nil合体演算子を使用する方法ではありません。あなたは 'var a:Int8(c!)?? "おそらくあふれた"。 – brandonscript

答えて

2

ここで起こっがたくさんあります:

  1. aオーバーフロー、128Int8Int8.max = 127)に格納できる最大値よりも大きい場合becaue、したがってはnilを返します。

    これnilは、別名、Optional.NoneはタイプOptional<Int8>であるaの型注釈で指定されたタイプ(Int8??、別称Optional<Optional<Int8>>)ではないので、正しいタイプである、Optional.Some(Optional.None)になって、別のオプションに包まれています。

  2. nilCoalescing()は何も返しません。 (実際には別称、Void()を返す意味する)

  3. は、この明示的nilチェックと力アンラップ(!)しないでください:a != nil ? a! : bを。代わりに??を使用してください:a ?? b

あなたがここに行うために、正確に何をしようとしていますか?

+0

"このnil、a.k.a. Optional.Noneは別のオプションでラップされ、Optional.Some(Optional.None)になります。これは多分OPの混乱の鍵です。 –

+0

@JoshCaswellそれは私が疑うところですが、正直なところ私は知らない。これは全く無意味ですlol – Alexander

+0

私は2回nilを割り当てようとしました。 –

3

128オーバーフローそれはゼロとして格納されているように、INT8に変換します。