【问题标题】:Variable used before being initialised初始化前使用的变量
【发布时间】:2015-07-04 00:17:39
【问题描述】:

我写了下面的代码,总是报错

(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)
    }

【问题讨论】:

  • 在哪一行显示这个错误?
  • println(self.pointOnMap) // 返回错误 (1) self.pointOnMap!.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon) // 返回错误 (2)
  • @Volker 按照链接中的建议将其作为隐式展开的可选选项也不起作用。
  • 你看链接了吗,init里面的调用顺序不一样!我手头没有官方文档,但我记得也提到过类似的东西。

标签: swift


【解决方案1】:

我无法重现您的设置,因此无法使用您的确切示例进行测试,但我认为您应该使用方便的初始化程序和 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)
    }
}

看看“指定的和便利的初始化程序在行动”in this page,我认为它涵盖了你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多