2014-10-03 13 views
22

Bu Swift geçerli kod şudur:Swift nil sayısal bir değere sahip mi?

println(nil < 1) 

Ve çıkış aynı şekilde, gerçek olacaktır

println(nil > 1) 

yanlış olacaktır (sayı 1, sizin için aynı şeyi yapabilirsiniz -1 keyfi ve Muhtemelen başka bir şey). Ben toInt() döner Int? dikkate yanlış görünüyor derlenmiş bir sayısal değer ve ona, hiç "some_string".toInt() karşılaştırmaya çalıştık bazı kodlar gördüğüm için sormak nedenidir.

Benim sorum bu Swift geçerli sözdizimi olmalı mı? Eğer öyleyse, nil sayısal değeri nedir?


Swift 3.0 Güncelleme: Swift Evrim removing the optional comparison operators bu sorunu ele gibi

görünüyor. Bu, artık derlenmediği için Swift 3.0'da bir sorun değil.

+2

Bu bana bir hata gibi görünüyor. Int olarak –

+0

'Int.min? > Nil' '$ R14: Bool = TRUE belki karşılaştırmak olanak tanımayı amaçlayan iki' Int 've' Kesinlikle ilginç @BryanChen Int.min> nil' vermek hata –

+0

derlemek?. Bu bağlamda kesinlikle bir hata söyleyebilirim ama bu sonuca nasıl geldiğini bilmek isterim. Sanırım olsaydı –

cevap

17

Neler olup bittiğine inanıyorum ki 1, nil ile karşılaştırmalı olarak Int? türüne dolaylı olarak yazılmıştır. Swift'e alışkın olmayanlar için biraz daha açıklayacağım. Swift'in, bir değeri olan veya nil olabilen "isteğe bağlı" adlı bir konsepti vardır. Açıkça isteğe bağlı olarak tanımlanmamış bir değişkene nil atamak yasadışı (Haskell aşina olanlar için, bu. Temelde Maybe monad), böylece let i: Int = nil derleyici tarafından reddedilecektir. Bu, bu cevabın kapsamı dışında kalan çeşitli faydalar sağlar ve bunu yapmak için oldukça zekice bir yoldur.

Burada neler oluyor olsa da, edebi 1 birkaç türde geçerli bir değer olmasıdır: vb Int, Int32, Int64, UInt32, UInt64, vs, vs, Ve da geçerli bir değerdir bu türlerin opsiyonel versiyonlar: Swift derleyici bir değişmez değer ve nil arasında bir karşılaştırma gördüğünde Int?, Int32? vb

Yani, hem bu değerler için geçerli olacak bir tip bulmaya çalışır. 1 Int? türü için geçerli bir değerdir ve nil da Int? türü için geçerli bir değerdir, bu nedenle tip imza (Int?, Int?) -> Bool ile karşılaştırılması operatörünü uygular. (Bu, iki değerini alan ve Bool değerini döndüren karşılaştırma operatörüdür). Bu işlevin kuralları, nil değerlerinin Int.min numaralı hatta başka herhangi birinden daha düşük olduğunu söyler ve OP'nin sorusunda görülen sonucu elde edersiniz.

+1

Bu arada, bu Haskell'de (anlayabildiğim gibi) mümkün olmazdı, çünkü “Belki” monadının iki olası değere sahip olduğu tanımlanır: ya “Nothing” ya da “Just x” (x 'in herhangi biri olabilir) tipi). Ve 'x' hiçbir zaman dolaylı olarak 'x''e terfi edilemeyeceğinden, Haskell derleyicisi,' Belki Int' ve 'Belki Int' türlerini karşılaştıran bir karşılaştırma operatörü varsa,' 1 'ile' Hiçbir şey 'arasındaki herhangi bir karşılaştırmayı yasaklardı. çünkü, ilk "Int" türündedir ve "Int" ve "Belki Int" değerlerini karşılaştırmak için operatör yoktur. (Ama 'Just 1' ve' Nothing' kelimelerini karşılaştırmak geçerli olurdu: her ikisi de “Belki Int” türündendir). – rmunn

+0

Önceki yorumumda parantezin düzeltilmesi: 'Hiçbir şey',' x', herhangi bir türde olabilir, belki de x' değeridir. Fakat bu, 'Belki Int' türüyle eşleşir, dolayısıyla karşılaştırma geçerli olur. – rmunn

+7

' (lhs: T ?, rhs: T?) -> Bool'; Bunun nereden geldiğini düşünüyorum. Hızlı bir test fonksiyonunun yazılması: 'func testi (lhs: T ?, rhs: T?)' Ve 'test (nil, 1)' fonksiyonlarını çağırır. 'Println (_stdlib_getDemangledTypeName (rhs))' işlevini çağırmak, bu fonksiyonun içinde 'Swift.Optional'; println (_stdlib_getDemangledTypeName (rhs!)) '' Swift.Int '' yazdırılıyor. Yani, “1” olarak geçen rhs, bir “Int?”. –