2016-08-18 3 views
1

Ich habe eine gemischte Obj-C - Swift App.
Meine benutzerdefinierte Obj-C MapViewController hat die folgende Headerdatei, wo Item eine benutzerdefinierte Klasse in Swift geschrieben ist:Swift: "Wert des Typs 'Artikel!' Kann nicht zugewiesen werden. "Item!"

@class Item; 
@interface MapViewController : UIViewController 
@property (nonatomic, strong) Item *item; 
@end 

Die Segue zum MapViewController mit einem Item Objekt initiiert wird item

self.performSegueWithIdentifier(kMapSegueId, sender: item) 
mit

Dies ruft, wo item gesendet wird als sender:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == kMapSegueId { 
     let mapViewController = segue.destinationViewController as! MapViewController 
     mapViewController.item = sender as! Item! // This gives the error 
    } 
} 

jedoch die Zuordnung zum Objekt item der MapViewController gibt dem Compiler-Fehler

Wert kann nicht vom Typ zuzuweisen ‚Item!‘ "Item!"

Wie kann ich diesen seltsamen Fehler vermeiden?

+1

Das 'as!' Entpackt bereits das optionale, das Ausrufezeichen nach 'Item' ist bedeutungslos und höchstwahrscheinlich das Problem. – vadian

+0

@vadian: Ich habe das schon mal probiert, aber ohne das Ausrufezeichen hinter Item, bekomme ich den Fehler "Kann keinen Wert vom Typ 'Item' zuweisen um 'Item!'" –

+0

Hat 'Item'' 'objc' Attribut? –

Antwort

1

Als Vadian und Rob Napier, schlug meinen Code aufgrund der Ausrufezeichen hinter Artikel falsch war.
Das Entfernen führte jedoch zu einem anderen Compilerfehler. Der Grund war der folgende:

Als ich anfing, mein vorhandenes Obj-C Projekt auf Swift zu übersetzen, richtete ich den Überbrückungskopf ein und importierte dort alle meine h-Akten, da alle meine Klassen in Obj-C geschrieben wurden . Ich begann dann Klasse für Klasse in Swift zu übersetzen.
Was ich vergessen habe, war das Entfernen der Anweisung #import für die Dateien, die bereits in Swift übersetzt wurden. Also gab es noch Importanweisungen für die Klassen Item und ViewController.

Sobald ich diese Importanweisungen aus dem Bridging-Header löschte, verschwand der Compilerfehler.

4

Entfernen Sie die zusätzlichen !. Sie sollten zu Item, nicht Item! konvertieren.

mapViewController.item = sender as! Item 

Der Compiler versucht hier zu viele implizite Bridges zu machen; Es ist eine Brücke zu weit. Obwohl ich wette, der Typ .item ist Item!, sollten Sie das ignorieren und immer als Item. ! Arten in Swift 2.2 haben eine Menge Komplexität um sie herum (und sollten wann immer möglich vermieden werden), verbunden mit einer Menge magischer ObjC-Überbrückung. Aus diesem Grund ist sie in Swift neu gestaltet wurden 3.


Die oben ist wahr, aber wahrscheinlich nicht Ihr Problem. Das Problem ist, dass sender selbst optional ist. Sie versuchen also, von AnyObject? zu Item zu casten. Sie müssen zuerst sender entweder mit if let oder ! auspacken.

mapViewController.item = sender! as! Item 

würde ich wahrscheinlich umschreiben dies als:

if let item = sender as? Item, 
    mapViewController = segue.destinationViewController as? MapViewController 
    where segue.identifier == kMapSegueId { 
    mapViewController.item = item 
} 
+0

Ich habe das schon einmal versucht, aber ohne das Ausrufezeichen hinter Item, bekomme ich den Fehler "Kann keinen Wert vom Typ 'Item' zuweisen um 'Item!'" –

+0

Danke für Ihren vorgeschlagenen Code. Ich habe es getestet, aber die Zuweisung gibt immer noch den Fehler "Kann den Wert des Typs 'Artikel' nicht zuweisen, um 'Artikel!'" –

+0

Ihre Antwort ist richtig (+1), aber es löste mein Problem nicht, da es noch einen gab Problem in meinem Projekt. Ich werde meine Antwort in einer Minute veröffentlichen. –

Verwandte Themen