私はエラーメッセージが誤解を招くと思います。実際の問題は、2番目の呼び出しでリテラル1
を解釈する方法でした。
let a = 1 // a is an Int
しかし、コンパイラは、コンテキストに応じなどDouble
、UInt32
、CChar
、としてそれを読むことができます:
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
コンパイラには手がかりがありません具体的にはInt
、UInt
、UInt16
などのように、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
、 'のTYPE1 =タイプ(みましょう:1 ); type1 == Int.self' works – Sweeper
このような整数を初期化する方法があります 'type(of:Int(1))== Int.self // returns true ' これはなぜわかりません – Frederik
奇妙なことに、 'let b = type(of:1)'に 'b'を表示するとIntを出力します。 – paper1111