2015-04-25 4 views
0

Я написал код, приведенный ниже, и всегда получаю ошибкупеременных используются перед инициализируются

(1) Переменный self.pointOnMap использовал до инициализируются.

и

(2) Переменный self.pointOnMap захвачен закрытия перед тем, как инициализируется.

Я не понимаю, почему, потому что я объявил self.pointOnMap = MKPointAnnotation(), который должен инициализировать его достаточно рано.

class Pin: NSManagedObject { 
    var mapView: MKMapView? 
    var pointOnMap: MKPointAnnotation? 

    @NSManaged var lat: Double 
    @NSManaged var lon: Double 
    @NSManaged var photos: Photo? 

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
     super.init(entity: entity, insertIntoManagedObjectContext: context) 
     self.pointOnMap = MKPointAnnotation() 
    } 

    init(dictionary: [String : AnyObject], context: NSManagedObjectContext) { 
     let entity = NSEntityDescription.entityForName("Pin", inManagedObjectContext: context)! 
     super.init(entity: entity, insertIntoManagedObjectContext: context) 

     lat = 1.0 
     lon = 2.0 

     self.pointOnMap = MKPointAnnotation() 
     println(self.pointOnMap) // RETURNS ERROR (1) 
     self.pointOnMap!.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon) // RETURNS ERROR (2) 
    } 
+0

см. Http://stackoverflow.com/questions/27028813/error-in-swift-class-property-not-initialized-at-super-init-call-how-to-initi – Volker

+0

для какой линии это показывает эта ошибка? –

+0

println (self.pointOnMap) // RETURNS ERROR (1) self.pointOnMap! .coordinate = CLLocationCoordinate2D (широта: lat, longitude: lon) // RETURNS ERROR (2) – user3573256

ответ

0

Я не могу воспроизвести вашу установку, так что я не могу проверить с вашим точным примером, но я думаю, вы должны использовать удобство инициализатору и self.init вроде этого:

class Pin: NSManagedObject { 
    var mapView: MKMapView? 
    var pointOnMap: MKPointAnnotation? 
    @NSManaged var lat: Double 
    @NSManaged var lon: Double 
    @NSManaged var photos: Photo? 

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
     super.init(entity: entity, insertIntoManagedObjectContext: context) 
     self.pointOnMap = MKPointAnnotation() 
    } 

    // Replace `init` with `convenience init` 
    convenience init(dictionary: [String : AnyObject], context: NSManagedObjectContext) { 

     let entity = NSEntityDescription.entityForName("Pin", inManagedObjectContext: context)! 

     // Call the overriding init with `self.init(...)` instead of `super.init(...)` 
     self.init(entity: entity, insertIntoManagedObjectContext: context) 

     // Now, self.pointOnMap has the value declared by `override init` 

     lat = 1.0 
     lon = 2.0 

     self.pointOnMap = MKPointAnnotation() 
     println(self.pointOnMap) 
     self.pointOnMap!.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon) 
    } 
} 

Have посмотрите на «Инициализаторы назначенных и удобных в действии» in this page, я думаю, что он охватывает ваш случай.

Смежные вопросы