2014-06-19 4 views
12

Warum funktioniert das Folgende nicht in Swift?Swift === mit Null

if someObject === nil { 
    } 

Sie haben den Test mit dem Operator == zu tun wie

if someObject == nil { 
    } 

Ich dachte, dass === mehr war die Instanzen wie die Herstellung sicher, wo genau die gleiche (im Grunde die Zeiger zu vergleichen) und == war eher ein isEqual-Check. So würde ich denken === wäre besser geeignet zum Testen gegen Null, aber ich bin offensichtlich falsch.

In der Dokumentation:

=== oder „Identisch mit“ bedeutet, dass zwei Konstanten oder Variablen der Klasse Typ Instanz genau die gleiche Klasse beziehen.

== oder „Gleich“ bedeutet, dass zwei Instanzen „gleich“ betrachtet oder „äquivalent“ in Wert, für einige geeignete Bedeutung von „gleich“, wie es durch die Art des Konstrukteurs festgelegt.“

+0

Folgendes funktioniert für mich 'Klasse Person {} lassen p = Person() lassen q: Person? = nil println (p === nil) println (q === nil) ' –

+1

Das Objekt hätte den Wert nil, nicht genau dasselbe Objekt wie nil, was === bedeutet. – milesper

Antwort

17

Es funktioniert genau wie Sie erwarten:

var s: String? = nil 
s === nil // true 

Die einzige Einschränkung, dass zu nil, Ihre Variable muss in der Lagenil sein zu vergleichen ist. Dies bedeutet, dass es sich um ein optionales, mit einem ? bezeichnet werden muss.

var s: String nicht nil, sein darf, so würde daher gibt immer false wenn ===-nil verglichen.

+4

Es gibt noch eine andere Einschränkung - es muss ein optionaler Klassentyp sein. Nicht ein 'Int?' Zum Beispiel. – Sulthan

+0

Das macht Sinn. Vielen Dank für die tolle Antwort. –

+0

@Sultan Kannst du deine Aussage erklären? Ist Int kein Klassentyp? – Boon

0

Mein erster Instinkt wäre, dass nil keine Klasseninstanz ist, sondern eine Referenz. So kann someObject keine äquivalente Klasseninstanz zu nil sein.