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

Posted

技术标签:

【中文标题】Swift4 中 MKPolygon 的指定初始化程序是啥?【英文标题】:What is the designated initializer for a MKPolygon in Swift4?Swift4 中 MKPolygon 的指定初始化程序是什么? 【发布时间】:2018-11-12 22:56:42 【问题描述】:

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

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

MKPolygon 的指定初始化器是什么?

按照this answer 和this one 的建议,我搜索了class documentation。有四个可用的初始化器,但它们都被声明为便利初始化器。

init(points: UnsafePointer, count: Int) init(points: UnsafePointer, count: Int, interiorPolygons: [MKPolygon]?) init(coordinates: UnsafePointer, count: Int) init(coordinates: UnsafePointer, count: Int, interiorPolygons: [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()
    

【问题讨论】:

How to subclass a class which doesn't have any designated initializers?的可能重复 【参考方案1】:

这个特定问题的真正答案是您可以对它们进行子类化,但您的子类不得要求使用自己的初始化程序。相反,您必须继续使用超类中的便利初始化程序。必须调用这些初始化程序,否则 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 仍然不会呈现数据,除非它自己的“方便” " - 标记的初始化程序被调用。

【讨论】:

【参考方案2】:

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

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

This answer,由 Matt 链接,对进一步阅读非常有帮助。

【讨论】:

以上是关于Swift4 中 MKPolygon 的指定初始化程序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS MKPolygon 模式

使用 MKPolygon 或 polygonWithCoordinates (Swift) 时遇到问题

从 SQLite 读取坐标并创建一个 MKPolygon

美国所有州的 iOS 覆盖(MKPolygon)数据?

Swift4.2~数组和字典(Array, Dictionary)基本类型转换

使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)