2016-05-24 5 views
2

私は奇妙な振る舞いに気づきました。 次のコードは、期待どおりに「見つからない」と表示します。少しスウィフト - 無制限にアクセスするとクラッシュしない

import Cocoa 

var array : [AnyObject]? 
array = [["one":"1"]] 

for element in array! { 
    if let check = element["two"] { 
     print(check) 
    } else { 
     print("Not found") 
    } 
} 

にコードを変更

import Cocoa 

var array = [["one":"1"]] 

for element in array { 
    if let check = element["two"] { 
     print(check) 
    } else { 
     print("Not found") 
    } 
} 

は「ゼロ」を出力します - それは私がnilで印刷可能なオブジェクト「に設定していない」とではありません迅速に思ったように私が期待したものではありません。

紛失しているものがありますか? ありがとう!

+0

配列が 'nil'である唯一の点は、オプションの型として宣言されていても初期化されていない点なので、なぜ' nil'になるのかはっきりしません。 'array'の値を直ちに設定します。これはアンラッピングまたは内容のチェックの前です。 2番目のケースでも「見つからない」と言われると思います。おそらく '[AnyObject?]と' [AnyObject]? 'の区別が明確でないかもしれません。 – mc01

+0

要素 "" two "がnilになると" check "がnilになるはずですが、" print(check ) "実際には" nil "を出力します –

+1

私は実際にコンパイラが最初に' AnyObject'を添字にすることに驚いています。私の意見では、そうすることは許されません。 – Hamish

答えて

2

2番目のケースでは、実際にはネストされたオプションを作成していますが、これは一般的には良い考えではありません(混乱の原因となります。あなたがラインに置く場合:

let foo = element["two"] 

fooの型を検査し、あなたはそれがAnyObject?!であることがわかります。したがってオプションで値を入れずにオプションで囲みます。これは、if/letステートメントを最初のオプションのラップを解除して、2番目のオプションであるnilを与えるようにする効果があります。

+0

私にそれをビート:) – Alexander

関連する問題