Swift4 中 MKPolygon 的指定初始值设定项是什么?

What is the designated initializer for a MKPolygon in Swift4?

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

Must call a designated initializer of the superclass 'MKPolygon'

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

遵循 this answer and , I've scoured the class documentation 的建议。有四个可用的初始化器,但它们都被声明为便利初始化器。

我是 Swift 的新手,所以我确信我缺少一些简单的东西。

我的 subclass 实现如下,以防有帮助。

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()
    }
}

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

在这种情况下,转入class是不可能的,唯一的行动似乎是延长您打算转入class的class。

,由 Matt 链接到,作为进一步阅读非常有帮助。

这个具体问题的真正答案是您可以将它们子类化,但是您的子类不能要求使用它自己的初始化程序。相反,您必须继续使用 super 类 中的便利初始值设定项。必须调用这些初始化程序,否则 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 仍然不会渲染数据,除非它自己的 "convenience" 标记的初始值设定项被调用。