2016-07-30 5 views
1

Ich habe im Internet ohne ein nützliches Ergebnis gesucht. Meine Frage ist sehr einfach. Wie zwei ListNode zu vergleichen ist gleich oder nicht? Zum Beispiel:Binär-Operator '! =' Kann nicht auf zwei ListNode Swift

// plused is a ListNode 
if plused != head?.next { // Binary operator '!=' cannot be applied to two ListNode 
    head?.val += 1 
} 

Kann mir jemand sagen, wie man das in Swift macht?


bearbeiten, 31. Juli 2016:

Diese beiden Knoten als Klasseninstanz deklariert sind

+0

Versuchen Sie den Identitätsoperator '! ==' – Sweeper

Antwort

0

Ich denke, Sie sollten Identitätsoperator verwenden Instanzen zu vergleichen.

  • Equal: ===

  • Nicht gleich: ==

Beispielcode:

if instance1 === instance { print("Equal") } 
if instance1 !== instance { print("Not Equal") } 

Aktualisiert Beispiel:Lösung in Schnell

class ListNode { 
    init() { print("Initializing node") } 
} 

class Head { 
    var next: ListNode 
    init(withNode node: ListNode) { next = node } 
} 

let plused = ListNode() 
let head = Head(withNode: plused) 

//(plused != head.next) ? print("Equal") : print("Not Equal") 
(object_getClass(plused) == object_getClass(head.next)) ? print("Equal") : print("Not Equal") 

Lassen Sie mich wissen, ob diese Lösung Ihre Abfrage löst.

+0

Ich erfuhr vom Swift doc, dass '===' bedeutet, dass zwei Instanzen von ** derselben Klasse ** geerbt werden. Nun, hier erben zwei Knoten von derselben Klasse, aber sie sind möglicherweise nicht derselbe Knoten. Hab ich recht? –

+0

@ JW.ZG: Der Identitätsoperator '===' prüft, ob seine beiden Operanden die _exakt gleiche Instanz_ eines Objekts sind, d. H., Ob es zwei Variablen sind, die auf dieselbe Referenz zeigen. Dies kann oder kann nicht das sein, was Sie wollen, es hängt von den Implementierungsdetails Ihrer verknüpften Liste ab. '==' prüft auf Gleichheit (ob die Operanden semantisch äquivalent sind) und ist für jeden Typ selbstdefiniert. – Arclite

+0

@ JW.ZG: ** '===' ** bedeutet, dass zwei Konstanten oder Variablen des Klassentyps sich auf genau die gleiche Klasseninstanz beziehen. Abgeleitet von [link] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82). Aber in Ihrem Fall, was sind die Arten von 'Plus' & 'Kopf? .next'. Ich meine, ist es als Klasse oder Struct deklariert? – Tesan3089

1

!= ist ein Operator, der vom Equatable Protokoll bereitgestellt wird. Wenn Ihr ListNode Typ (struct, class, etc.) diesem Protokoll nicht entspricht (indem Sie die ==-Funktion implementieren), können Sie != nicht für sie verwenden.

Verwandte Themen