0

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

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

指定的初始化器是做什么用的MKPolygon

按照这个答案这个的建议,我搜索了类文档。有四个可用的初始化器,但它们都被声明为便利初始化器。

我对 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()
    }
}
4

2 回答 2

2

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

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

这个由马特链接的答案对于进一步阅读非常有帮助。

于 2018-11-12T23:17:28.250 回答
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 仍然不会呈现数据,除非调用了它自己的“方便”标记的初始化程序。

于 2020-05-22T01:13:20.357 回答