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] = []
您可能认为您可以添加自己的初始化程序并简单地覆盖 points
和 pointCount
之类的方法(例如,类似于您对 NSString 所做的),但 MapKit 仍然不会呈现数据,除非它自己的“方便” " - 标记的初始化程序被调用。
【讨论】:
【参考方案2】:根据上面 Matt 的有用评论,答案是 MKPolygon 和其他几个类没有可访问的指定初始值设定项。
在这种情况下,子类化是不可能的,唯一的做法似乎是扩展您打算子类化的类。
This answer,由 Matt 链接,对进一步阅读非常有帮助。
【讨论】:
以上是关于Swift4 中 MKPolygon 的指定初始化程序是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 MKPolygon 或 polygonWithCoordinates (Swift) 时遇到问题