2016-09-17 5 views
17

Der folgende Code verwendet, um in Swift 2.2, nicht mehr in Swift 3.0 kompilieren zu können. Wie können wir das beheben?Binärer Operator '===' kann nicht auf Operanden vom Typ 'Beliebig' angewendet werden. und 'UIBarButtonItem!'

Error: Binary operator '===' cannot be applied to operands of type 'Any?' and 'UIBarButtonItem!'

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if sender === saveButton { // Error! 
     // ... 
    } else if sender === closeButton { // Error! 
     // ... 
    } 
} 
+0

Warum Sie nicht einfach vergleichen mit '=='? –

+0

Hallo @EvgenyKarkan, weil ich den Wert dieser beiden Objekte nicht vergleichen möchte. Aber stattdessen muss ich wissen, ob sie die gleiche Instanz sind. Weitere Informationen hierzu finden Sie in [Swift enthält außerdem zwei Identitätsoperatoren (=== und! ==), mit denen Sie testen können, ob sich zwei Objektreferenzen auf dieselbe Objektinstanz beziehen.] (Https://developer.apple. com/bibliothek/inhalt/dokumentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html) –

Antwort

38

Da die Fehlermeldung zu sagen hat. In Swift 3 wird Objecitve-C id als Any importiert, und Sie können keine Operationen für Any einschließlich === ohne explizite Umwandlung aufrufen.

Try this:

if sender as AnyObject? === saveButton { 

(. Trotzdem für andere sender Vergleich)

Und denken Sie daran, in Swift 3, as AnyObject einer der gefährlichsten Operationen geworden ist, sollten Sie nicht as AnyObject verwenden in anderen Fällen.

+0

Wie wurde 'id' vor Swift 3 importiert? – Honey

+1

@Honey, Objective-C 'id' wurde als' AnyObject' importiert, und nur einige Swift-Typen mit begrenztem Wert konnten in 'AnyObject' konvertiert werden. – OOPer

+1

Ihr Hauptunterschied ist also: * AnyObject ist nur für Referenztypen (Klassen), Any ist sowohl für Wert als auch für Referenztypen. – Honey

10

Versuchen optional Bindung mit bedingtem Guss mit der Art des Artikels, um die vor dem Vergleich:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let sender = sender as? UIBarButtonItem, sender === saveButton { 
     // ... 
    } else if let sender = sender as? UIBarButtonItem, sender === closeButton { 
     // ... 
    } 
} 
Verwandte Themen