Swift4中MKPolygon的指定初始化程序是什么?

时间:2018-11-12 22:56:43

标签: swift4 mkpolygon

我正在尝试建立一个继承自MKPolygon的类,如下所示,但是编译器拒绝了我对super.init()的调用,并显示了以下错误消息:

  

必须调用超类'MKPolygon'的指定初始化程序

MKPolygon的指定初始化程序是什么?

按照this answerthis 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()
    }
}

2 个答案:

答案 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] = []
}

您可能认为您可以添加自己的初始化程序,并简单地覆盖pointspointCount之类的方法(例如,类似于NSString的方法),但是MapKit仍然不会渲染数据,除非称为自己的“便捷”标记的初始化程序。

答案 1 :(得分:1)

根据上面Matt的有用评论,原来的答案是MKPolygon和其他几个类没有可访问的指定初始化器。

在这种情况下,子类化是不可能的,唯一的行动似乎是扩展您打算子类化的类。

由Matt链接的

This answer对于进一步阅读很有帮助。