2016-03-29 8 views
0

Ich habe einen Block von Code, der vor dem neuesten Swift 2.2-Update zu funktionieren schien, aber jetzt funktioniert es nicht. Unten sind die relevanten Auszüge des Codes.Swift 2.2: Wert des Typs 'Element' (auch bekannt als 'AnyObject') hat kein Mitglied 'objectID'

 class Event { 
     var eventObjectID:NSManagedObjectID? 
     var eventDate:NSDate? 
     var eventNotes:String? 
     var eventType:String? 

     init(eventObjectID: NSManagedObjectID, eventDate: NSDate, eventNotes: String, eventType: String) { 
      self.eventObjectID = eventObjectID 
      self.eventDate = eventDate 
      self.eventNotes = eventNotes 
      self.eventType = eventType 
     } 
    } 


class EventsViewController: UIViewController { 

     var eventsListArray:[Event] = [Event]() 
     var selectedAquarium:Aquarium! 
     var selectedFilters = [String]?() 

     //Load Core Data into the noteListArray so that we can populate the table view. 
     func setEventsListArray() { 
      //Fetch all of the events from Core Data 
      var results: NSArray = fetchFromCoreData("Event") 

      //Sort the list so that the newest entries are on top 
      let sortDescriptor = NSSortDescriptor(key: "eventDate", ascending: false) 
      results = results.sortedArrayUsingDescriptors([sortDescriptor]) as NSArray 

      //Find only the event entries that are related to this aquarium and match the selected filters 
      if (results.count > 0) { 
       for fetchResult in results { 
        let currentAquarium = fetchResult.valueForKey("aquarium") as! CoreDataAquarium 

        for selectedFilter in selectedFilters! { 
         let currentEventType = fetchResult.valueForKey("eventType") as! String 

         //Find only the events related to this aquarium and scrap the rest 
         if (currentAquarium.objectID == selectedAquarium.aquariumObjectID && currentEventType == selectedFilter) { 

          //"This event matches the filter..." 

          let newEvent:Event = Event(eventObjectID: fetchResult.objectID, 
           eventDate: fetchResult.valueForKey("eventDate") as! NSDate, 
           eventNotes: fetchResult.valueForKey("eventNotes") as! String, 
           eventType: fetchResult.valueForKey("eventType") as! String) 

          eventsListArray.append(newEvent) 
         } 
        } 
       } 
      } else { 
       print("No results returned...") 
      } 
     } 
} 

ich die folgenden zwei Fehler in der Zeile, wo ich newEvent (nahe dem Ende des Codes) zu initialisieren:

  • Verwendung von nicht deklarierten Typ ‚NSManagedObjectID‘
  • Werten vom Typ ‚Element ' (alias' AnyObject ') hat kein Mitglied' objectID '

Haben diese Fehler mit dem neuen Swift-Sprachupdate zu tun? Oder vermisse ich gerade etwas wirklich Offensichtliches?

+1

Haben Sie vergessen, CoreData zu importieren? – matt

+0

Durn it .... Ja, habe ich. Haha danke! – Josh

+0

Ich werde das als eine tatsächliche Antwort eingeben. – matt

Antwort

2

Die Unfähigkeit des Compilers den Begriff NSManagedObject schlägt vor, zu erkennen, dass es über den Core Data Rahmen valueForKey("...") as! ... Ausdrücke nicht weiß, loszuwerden. Sie müssen sagen

import CoreData 

(normalerweise ganz oben in dieser Datei).

1

Verwenden Sie Swift native Auflistungstypen so oft wie möglich. NSArray ist zu unspezifiziert. Sie müssen das Array nicht in NSArray umwandeln, um es sortieren zu können.

//Fetch all of the events from Core Data 
var results = fetchFromCoreData("Event") 

//Sort the list so that the newest entries are on top 
results.sortInPlace {($0.valueForKey("eventDate") as! NSDate).compare($1.valueForKey("eventDate") as! NSDate) == .OrderedDescending } 

Das löst wahrscheinlich die Typprobleme.

PS: Betrachten wir eine NSManagedObject Unterklasse zu verwenden, um von allen

+0

Sieht so aus, als hätte ich irgendwie versehentlich die CoreData-Import-Zeile gelöscht. Aber Sie geben tatsächlich einige wirklich nützliche Ratschläge und ich werde mich darum kümmern und hoffentlich meinen Code verbessern. Vielen Dank. – Josh

+0

Diese Antwort ist für das Problem, das das OP tatsächlich hat, völlig irrelevant. Es ist auch absolut richtig! OP, du solltest diesen Rat definitiv annehmen. – matt

+0

Muss für 'as!' (Zweimal sogar) ablehnen. Es ist sehr unwahrscheinlich, dass du ein Jedi bist. – nhgrif