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 的建议。有四个可用的初始化器,但它们都被声明为便利初始化器。
- init(points: UnsafePointer, count: Int)
- init(points: UnsafePointer, count: Int, interiorPolygons: [MKPolygon]?)
- init(坐标:UnsafePointer,计数:Int)
- init(坐标:UnsafePointer,计数:Int,interiorPolygons:[MKPolygon]?)
我是 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] = []
}
你可能认为你可以添加你自己的初始化器并简单地覆盖像 points
和 pointCount
这样的方法(类似于你对 NSString 的做法),但是 MapKit 仍然不会渲染数据,除非它自己的 "convenience" 标记的初始值设定项被调用。
我正在尝试设置一个继承自 MKPolygon 的 class,但编译器拒绝了我对 super.init()
的调用,并显示以下错误消息:
Must call a designated initializer of the superclass 'MKPolygon'
MKPolygon
的指定初始化程序是什么?
遵循 this answer and
- init(points: UnsafePointer, count: Int)
- init(points: UnsafePointer, count: Int, interiorPolygons: [MKPolygon]?)
- init(坐标:UnsafePointer,计数:Int)
- init(坐标:UnsafePointer,计数:Int,interiorPolygons:[MKPolygon]?)
我是 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。
这个具体问题的真正答案是您可以将它们子类化,但是您的子类不能要求使用它自己的初始化程序。相反,您必须继续使用 super 类 中的便利初始值设定项。必须调用这些初始化程序,否则 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 仍然不会渲染数据,除非它自己的 "convenience" 标记的初始值设定项被调用。