RP-3
RP-3

Reputation: 724

What is the designated initializer for a MKPolygon in Swift4?

I'm trying to set up a class that inherits from MKPolygon as below, but the compiler rejects my call to super.init() with the following error message:

Must call a designated initializer of the superclass 'MKPolygon'

What is the designated initializer for MKPolygon?

Following the advice of this answer and this one, I've scoured the class documentation. There are four initializers available but all of them are declared as Convenience Initializers.

I'm fairly new to Swift so I'm sure there's something simple I'm missing.

My subclass implementation is below, in case that helps.

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

Upvotes: 0

Views: 643

Answers (2)

seth
seth

Reputation: 1718

The real answer to this specific issue is that you can subclass them, but your subclass must not require using its own initializer. Instead you must continue to use the convenience initializers in the super classes. Those initializers must be called otherwise MapKit won't render the data.

For example with MKPolyline:

let mine = MyPolyline(coordinates: c, count c.count)
mine.other = ...
mine.foobar = ...

class MyPolyline: MKPolyline {
    var foobar: [Int] = []
    var other: [Double] = []
}

You might think you could add your own initializer and simply override methods like points and pointCount (similar to what you would for NSString for example), but MapKit still won't render the data unless its own "convenience"-marked initializers were called.

Upvotes: 4

RP-3
RP-3

Reputation: 724

Following Matt's helpful comment above, it turns out the answer is that MKPolygon and several other classes do not have accessible designated initializers.

In such a case subclassing is not possible, and the only course of action appears to be to extend the class you intended to subclass.

This answer, linked to by Matt is supremely helpful as further reading.

Upvotes: 2

Related Questions