2016-06-15 2 views
1
var a = 7 
a != nil //Error: value of type 'Int' can never be nil, comparison isn't allowed 
7 != nil //--> false 
0 > nil //true 
-9999999 > nil //true 

質問非常に上記のコードのように、[OK]を私はそれがnilaを比較することはできませんコンパイラからそれを得たが、なぜリテラル7はnilにして比較することができます。私は7が作成された既存の番号であることを意味します、それは決してnilでもありませんか?通常の型付き変数はnilと比較することはできませんが、リテラル缶はなぜですか?

ところで 私もtrueを返し-9999999 > nilをしようとすると、私が最終的に正しい方法でnilを知って始めます。 10分前に私はまだ-1 < niltrueを返すと思います。 nilについてもう少し詳しく教えていただければ幸いです。それは何ですか?これはポインタではありません(Object-Cと異なります)。それは単に気づくだけですか?

+0

比較http://stackoverflow.com/questions/33216358/swift-operators-and-nilおよびhttp://stackoverflow.com/questions/26172911/swift-nil-has-a-numeric-value –

+0

@MartinR提供された情報をありがとう – SLN

答えて

2

これがために外を見るためのポイントは、オプションのリテラルコンバーチブルはnilにできることである標準ライブラリ

/// A type that can represent either a `Wrapped` value or `nil`, the absence 
/// of a value. 
public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible { 
    case None 
    case Some(Wrapped) 

からです。

第二に、これは比較ですが、このリンクにgithubの上で見ることができスウィフトライブラリで定義されている方法です:組み合わせGithub Swift Optional Implementation Code

public func < <T : Comparable> (lhs: T?, rhs: T?) -> Bool { 
    switch (lhs, rhs) { 
    case let (l?, r?): 
    return l < r 
    case (nil, _?): 
    return true 
    default: 
    return false 
    } 
} 

public func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool { 
    switch (lhs, rhs) { 
    case let (l?, r?): 
    return l > r 
    default: 
    return rhs < lhs 
    } 
} 

はあなたのコードを理由に使用することができます。次のように

戦略は次のとおりです。

0 > nil 
  1. 0は、暗黙的には、オプションまたはintに推定されます?。
  2. スウィフトOptinalはLHSがnilであれば言う<を持って、その後return true
  3. スウィフトオプションがあるRHSが、その後return true

は、ステップ2を簡略化するために nilであると述べてい> 3:は常にゼロより小さい。

>/<の比較では、どちらの側もnilでない場合、要素タイプを考慮しません。

とINTがOptional.Noneと比較することはできません、これはそのコンパイラが出て叫ぶまさにであることを

var a = 7 
    a != nil 

その明白なの場合は

希望です。

+0

あなたの詳細な説明と助けに感謝します。それは多くの助けになる – SLN

関連する問題