2015-10-19 28 views
14

Bu davranışın açıklaması nedir?Swift operatörleri ve nil

let x: Int? = nil 
if x < 10 { 
    print("x < 10") 
} 

"x < 10" yazdırır. Bu bir çalışma zamanı hatası mı, yoksa en azından bir derleyici uyarısı mı üretmeli?

DÜZENLEME:

Ben Apple'a hata raporu sunmuş ve başka raporun mevcut bir kopyası olarak bunu kabul etti. Yani bu bir şekilde Apple tarafından ele alınacak/sabitlenecektir.

+0

Ayrıca '' isteğe bağlı'ların 'let' ile bildirilmesine izin verilmesinin ilginç olacağı - yanlış düşünülmüş gibi görünüyor - –

+1

Bana bir hata gibi görünüyor, nil ile doğrudan karşılaştırırsanız bile çalışır. <-100' –

+1

Böylesine temel bir dil seviyesinde bir hataya inanmak zor. – Darko

cevap

15

İki şey (biz bunu sevmesem) burada gerçekleşir: Önce, bir operatör yatan tip karşılaştırılabilir ise iki isteğe bağlı öğeleri karşılaştırır

public func <<T : Comparable>(lhs: T?, rhs: T?) -> Bool 

yoktur. Davranış (bildiğim kadarıyla) belgelenmemiş, ancak Optional<T>.NoneOptional<T>.None'un Optional<T>.Some(value) numaralı Optional<T>.Some(value) numaralı değerlerden daha az olduğu düşünülmektedir.

İkincisi,enum Optional bir kurucu

if x < 10 { ... } 

lhs Şimdi

/// Construct a non-`nil` instance that stores `some`. 
public init(_ some: Wrapped) 

tip Optional<Int> sahiptir vardır. < operatörünün tek adayı yukarıda belirtilen iki opsiyonu karşılaştırır. nedenle rhs'si da, isteğe bağlı olarak çıkarılır, bu nedenle bu

if x < Optional<Int>.Some(10) { ... } 

Güncelleme eşdeğerdir:

Bu özellik, Swift 3'te kaldırıldı

(SE-0121 – Remove Optional Comparison Operators) ve bu kodu artık Xcode 8 (şu anda beta 6) ile derleme yapmıyor.

+3

harika bir açıklama. Bu kadar brüt olsa da. : D –

+0

Sadece aynı sonuçlara geldim. Varsayımını tanımlayan "Karşılaştırma" protokolü için * bazı * belgeler vardır; ancak, bu açıklama, isteğe bağlı olanları tamamen yok sayar. – Sulthan

+0

Tipik olarak göründüğü için özellikle çirkin. Örneğin. Bir oyunda x Abizern