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调用中初始化
答案 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
。否则,您的值都已正确初始化。