如何避免覆盖超类初始化器

时间:2018-01-14 05:35:17

标签: swift google-maps oop inheritance initialization

我需要使用其超类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;

1 个答案:

答案 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)
    }
}