2017-03-22 6 views
7

このコードは動作しますが、3スウィフトです:迅速なリテラルのタイプの比較に失敗しますか?

let a = 1 
type(of: a) == Int.self // true 

しかし、非常にこのコードは失敗します。

// error: binary operator '==' cannot be applied to two 'Int.Type' operands 
type(of: 1) == Int.self 

あれば、第2の比較作業を行うための構文は何ですか?

ありがとうございます。

+0

、 'のTYPE1 =タイプ(みましょう:1 ); type1 == Int.self' works – Sweeper

+0

このような整数を初期化する方法があります 'type(of:Int(1))== Int.self // returns true ' これはなぜわかりません – Frederik

+0

奇妙なことに、 'let b = type(of:1)'に 'b'を表示するとIntを出力します。 – paper1111

答えて

4

私はエラーメッセージが誤解を招くと思います。実際の問題は、2番目の呼び出しでリテラル1を解釈する方法でした。

let a = 1 // a is an Int 

しかし、コンパイラは、コンテキストに応じなどDoubleUInt32CChar、としてそれを読むことができます:

func takeADouble(value: Double) { ... } 
func takeAUInt(value: UInt) { ... } 

takeADouble(value: 1) // now it's a Double 
takeAUInt(value: 1) // now it's a UInt 

type(of:)はとしてdefinedであるあなたは、変数を定義Intへスウィフトデフォルト汎用関数:

func type<Type, Metatype>(of: Type) -> Metatype 

コンパイラには手がかりがありません具体的にはIntUIntUInt16などのように、Typeの一般的なパラメータをどのように解釈するのですか?ここで私はIBMスウィフトサンドボックスから得たエラーがあります:

Overloads for '==' exist with these partially matching parameter lists 
(Any.Type?, Any.Type?), (UInt8, UInt8), (Int8, Int8), 
(UInt16, UInt16), (Int16, Int16), (UInt32, UInt32), ... 

あなたはcoompilerにそれが何であるかの種類にそれを伝えることにより、いくつかの助けを与えることができます。興味深いことに

type(of: 1 as Int) == Int.self 
+0

' type(of:) 'はジェネリック関数として定義されていますが、実際には直接呼び出されません。特殊ケースとして扱われますタイプチェッカー([実装のコメントに従って)(https://github.com/apple/swift/blob/master/stdlib/public/core/Builtin.swift#L738))。したがって、これはたぶん型チェッカのバグです。あなたが言うように、他の型情報がないときには、デフォルトでは 'Int'がデフォルトになります。これは明らかにここにあります。 – Hamish

+0

ここにたくさんの良い情報があります。ありがとう! – agro1986

関連する問題