我正在尝试建立一个继承自MKPolygon的类,如下所示,但是编译器拒绝了我对super.init()
的调用,并显示了以下错误消息:
必须调用超类'MKPolygon'的指定初始化程序
MKPolygon
的指定初始化程序是什么?
按照this answer和this one的建议,我对class documentation进行了搜索。共有四个初始化器,但都被声明为便捷初始化器。
我对Swift还是很陌生,所以我确定我缺少一些简单的东西。
下面是我的子类实现,以帮助您。
import MapKit
import UIKit
class AudioGuideRegionAnnotation: MKPolygon {
// MARK: - Properties
let color: UIColor
let image: UIImage?
// MARK: - Initializers
init(region: AudioGuideRegion) {
var locations = region.locations
super.init(coordinates: &locations, count: locations.count) // <-- rejected with "Must call a designated initializer of the superclass 'MKPolygon'"
self.title = region.title
self.subtitle = "\(Int(round(Double(region.duration / 60)))) minutes"
self.color = .black
self.image = region.images.first?.image
super.init()
}
}
答案 0 :(得分:2)
此特定问题的真正答案是您可以将它们子类化,但是您的子类必须不需要使用其自己的初始化程序。相反,您必须继续在超类中使用便捷初始化程序。必须调用这些初始值设定项,否则MapKit将无法呈现数据。
例如,使用MKPolyline:
let mine = MyPolyline(coordinates: c, count c.count)
mine.other = ...
mine.foobar = ...
class MyPolyline: MKPolyline {
var foobar: [Int] = []
var other: [Double] = []
}
您可能认为您可以添加自己的初始化程序,并简单地覆盖points
和pointCount
之类的方法(例如,类似于NSString的方法),但是MapKit仍然不会渲染数据,除非称为自己的“便捷”标记的初始化程序。
答案 1 :(得分:1)
根据上面Matt的有用评论,原来的答案是MKPolygon和其他几个类没有可访问的指定初始化器。
在这种情况下,子类化是不可能的,唯一的行动似乎是扩展您打算子类化的类。
由Matt链接的This answer对于进一步阅读很有帮助。