我需要使用其超类Place
中的init方法初始化GMSMarker
对象。问题是Place
还从BaseModel
继承了一个init方法,这样我就可以从JSON创建对象了。我以为我可以在GMSMarker
的init方法中调用BaseModel
的init方法但不能。
放置
class Place: BaseModel, GMSMarker {
var imageUrl: String
var name: String
required convenience init?(json: [String : AnyObject] {
// super.init(markerWithPosition:) // can't call GMSMarker init method.
}
}
BaseModel
protocol BaseModel {
init?(json: [String : AnyObject])
func toAnyObject() -> [String : AnyObject]?
}
GMSMarker初始化定义
/** Convenience constructor for a default marker. */
+ (instancetype)markerWithPosition:(CLLocationCoordinate2D)position;
答案 0 :(得分:0)
创建一个初始化程序,调用超类(GMSMarker
)的初始化方法&将值分配给任何其他属性,例如' name'。然后,当符合协议初始化程序时,只需调用您创建的self的初始化程序。
示例:
class Place: GMSMarker, BaseModel {
var name: String
// init
init(lat: Double, long: Double, name: String) {
// call init from GMSMarker superclass here.
super.init(position: CLLocationCoordinate2D(latitude: self.lat, longitude: self.long))
self.name = name
}
// BaseModel init
required convenience init?(json: [String : AnyObject]) {
guard let lat = json["lat"] as? Double, let long = json["long"] as? Double, let name = json["name"] as? Sring else {
return nil
}
// call init method of self inside BaseModel init.
self.init(lat: lat, long: long, name: name)
}
}