2015-10-19 9 views
14

この動作の説明は何ですか?スイフトオペレータとnil

let x: Int? = nil 
if x < 10 { 
    print("x < 10") 
} 

"x < 10"と表示されます。これはランタイムエラーまたは少なくともコンパイラの警告を生成すべきではありませんか?

EDIT:

私はアップルにバグレポートを提出し、彼らは別のレポートの既存の重複としてそれを認めました。だから、これは何らかの方法でAppleによって処理/修正されます。

+0

'オプション'は 'let'で宣言することが許されているべきだから、面白いです。 –

+1

私にはバグのようですが、' nilと直接比較しても動作します<-100' –

+1

このような基本レベルのバグを信じるのは難しいです。 – Darko

答えて

15

2つのことは、(我々はそれを好きかどうか)ここに起こる:まず、基になる型が同等であれば2つのoptionalsを比較 オペレータ

public func <<T : Comparable>(lhs: T?, rhs: T?) -> Bool 

があります。 振る舞いは(私の知る限り)文書化されていないが、 nil別名Optional<T>.Noneが 値Optional<T>.Some(value)すべての非ゼロ未満と考えているようです。

第二に、enum Optionalはコンストラクタ

if x < 10 { ... } 

LHSで今

/// Construct a non-`nil` instance that stores `some`. 
public init(_ some: Wrapped) 

タイプOptional<Int>を持っています。 < 演算子の唯一の候補は、上記の2つのオプションを比較したものです。 したがってRHSもオプションとして推測されるので、この は

if x < Optional<Int>.Some(10) { ... } 

Updateに等しい:

この機能はスイフト3で削除された

SE-0121 – Remove Optional Comparison Operators)およびそのコードXcode 8 (現在ベータ6)でコンパイルされなくなりました。

+3

すばらしい説明。しかし、これはとても重大です。 :D –

+0

私はちょうど同じ結果になった。デフォルトの '<'を定義している' Comparable'プロトコルのドキュメントがありますが、説明はオプションを完全に無視しています。 – Sulthan

+0

これは、同じタイプのように見えるので、特に醜いです。例えばプレイグラウンドでは 'x Abizern