2017-03-22 11 views
7

Swift 3'tür:Hızlı bir şekilde değişmeyen türlerin karşılaştırılması başarısız mı? Bu kod çalışır

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

Ancak dikkat çekici bu kod başarısız: Varsa

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

ikinci karşılaştırma çalışması için sözdizimi, nedir?

Çok teşekkürler.

+0

İlginçtir, 'tür1 = tipi (bir let: İşte IBM Swift Sandbox aldığım hata var 1 type1 == Int.self' çalışır – Sweeper

+0

Bir çözüm bu gibi bir Tamsayıyı başlatmak için olabilir 'tür (of: Int (1)) == Int.self // true döndürür Neden olduğunu bilmiyorum gerekli olsa da, – Frederik

+0

Garip bir şekilde, b 'yazdýrma b = yazýcý yazýcý (of: 1)' baskýlarý Int. – paper1111

cevap

4

Hata iletisinin yanıltıcı olduğunu düşünüyorum. Asıl konu, ikinci çağrıda literal 1'un nasıl yorumlanacağıydı.

let a = 1 // a is an Int 

Fakat derleyici bağlama bağlı vb Double, UInt32, CChar olarak okuyabilirsiniz:

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:) bir şekilde defined olan bir değişken tanımlamak bir Int Swift varsayılan Genel işlev:

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

Derleyici hiçbir ipucu yok Type genel parametresini nasıl yorumlayacağınız hakkında: Int, UInt, UInt16 vb.? Sen coompiler ne tür söylemek tarafından biraz yardım verebilir

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

:

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

' tür (of:) 'genel bir işlev olarak tanımlanır, ancak aslında doğrudan çağrılmadı - özel bir durum olarak ele alınır tip denetleyicisine göre ([uygulamadaki yoruma göre] (https://github.com/apple/swift/blob/master/stdlib/public/core/Builtin.swift#L738)). Bu nedenle, bu muhtemelen bir tip denetleyicisi hatasıdır. Literal ile hiçbir belirsizlik olmamalıdır, çünkü dediğiniz gibi, başka türden bir bilgi eksikken, buradaki "Açık" ifadesi varsayılan olacaktır. Burada – Hamish

+0

çok iyi bilgi var. Teşekkürler! – agro1986

İlgili konular