重新设计初始化(MKAnnotation)

时间:2016-05-03 11:55:36

标签: swift firebase mkannotation

class Point: NSObject, MKAnnotation {
var id: String?
var title: String?
var coordinate: CLLocationCoordinate2D
var subtitle: String?



init(id: String, dictionary: Dictionary<String, AnyObject>){
    self.id = id

    if let title = dictionary["title"] as? String {
        self.title = title
    }

    if let subtitle = dictionary["subtitle"] as? String {
        self.subtitle = subtitle
    }

    if let coords = dictionary["coordinates"] as? [String:[String:Double]] {
        self.coordinate.latitude = coords.values.first!["latitude"]!
        self.coordinate.longitude = coords.values.first!["longitude"]!
    }
   super.init()
}
/*
init(title: String, subtitle: String, coordinate: CLLocationCoordinate2D){
    self.title = title
    self.subtitle = subtitle
    self.coordinate = coordinate

}*/

}

我实现了初始化程序,用于在Map上创建Point。我必须重新设计init,因为我使用Firebase,数据库的结果都在字典中。 它写道:属性self.coordinate未在隐式生成的super.init调用中初始化

1 个答案:

答案 0 :(得分:0)

init(id: String, dictionary: Dictionary<String, AnyObject>){
    self.id = id

    if let title = dictionary["title"] as? String {
        self.title = title
    }

    if let subtitle = dictionary["subtitle"] as? String {
        self.subtitle = subtitle
    }

    if let coords = dictionary["coordinates"] as? [String:[String:Double]] {
        self.coordinate.latitude = coords.values.first!["latitude"]!
        self.coordinate.longitude = coords.values.first!["longitude"]!
    }
    super.init()
}

所以,这里的问题主要在于您只在coordinate内初始化if属性。由于coordinate未标记为可选项,因此根据Swift初始化程序的规则,在调用super.init()之前,会给它一个值。

因为您只在if内初始化它,if可能会失败而您根本不会初始化它。这会使实例处于完全无效的状态,根据Swift初始化程序的规则是不允许的,并且the first safety check失败。

  

安全检查1

     

指定的初始化程序必须确保所有属性   由类引入的它在委托之前被初始化   超类初始化器。

可以使coordinate成为可选的实例变量,必须与其他实例变量一样。但是,我认为可能最有意义的是id&amp; title可能也是非可选的,所有这些属性可能都应该是let常量。

因此,我会重写你的类和初始化程序:

class Point: NSObject, MKAnnotation {

    let id: String
    let title: String?
    let coordinate: CLLocationCoordinate2D
    let subtitle: String?

    init?(id: String, dictionary: [String: AnyObject]){
        self.id = id

        title = dictionary["title"] as? String

        subtitle = dictionary["subtitle"] as? String

        guard let 
            coordinates = dictionary["coordinates"] as? [String: [String: Double]], 
            latitude = coordinates.values.first?["latitude"],
            longitude = coordinates.values.first?["longitude"] else {

                return nil
        }

        coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)

       super.init()
    }
}

现在您有一个可用的初始化程序。如果字典中的任何值不正确,则初始值设定项将返回nil。否则,您的值都已正确初始化。