Переопределение с сохраненным свойством - PullRequest
0 голосов
/ 29 января 2019

Я расширил класс MKPointAnnotation следующим образом:

class CustomPointAnnotation: MKPointAnnotation{

    let eventID: Int
    let coords: CLLocationCoordinate2D
    var title: String? // error here
    let location:String

    init(eventID:Int, coords:CLLocationCoordinate2D, location:String, title:String?) {

        self.eventID = eventID
        self.coords = coords
        self.title = title
        self.location = location

        super.init()
    }
}

Я получаю сообщение об ошибке:

Cannot override with a stored property 'title' 

(Полагаю, я получу ту же ошибку, если переименуюmember coords to coordinate).

Итак, я попробовал следующее:

private var _title:String?

override var title: String? {
        get { return _title }
        set { _title = newValue }
    }

, но, добавив self.title = title в тело init, я получаю:

'self' used in property access 'title' before 'super.init' call

Если я перейду super.init() выше, я получаю два вида ошибок:

  1. Property 'self.eventID' not initialized at super.init call (1 error)
  2. Immutable value 'self.coords' may only be initialized once (repeated for every property)

Как правильно объявить свойство title?Есть ли возможность переопределить это?Я нашел много вопросов по этой теме, но ни одного примера с расширением встроенного класса.Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Зачем вам нужно снова объявить var title: String??подклассами MKPointAnnotation у вас уже есть доступ к title.(то же самое относится и к coords).

Вы можете просто установить заголовок после super.init()

init(eventID: Int, coords: CLLocationCoordinate2D, location: String, title: String?) {

        self.eventID = eventID
        self.coords = coords
        self.location = location

        super.init()
        self.title = title
    }

Если вы хотите переименовать coordiante в coords для удобства чтенияВ целях, я предлагаю использовать расширение:

extension CustomPointAnnotation {
    var coords: CLLocationCoordinate2D {
        get { return coordinate }
        set { coordinate = newValue }
    }
}

И назначить его после super.init() точно так же, как заголовок.

0 голосов
/ 29 января 2019

Вам нужно установить _title в инициализаторе вместо title.Поскольку это ваше собственное частное вспомогательное свойство для title, при первом обращении к title оно будет иметь правильное значение без необходимости его прямой установки.

class CustomPointAnnotation: MKPointAnnotation {

    let eventID: Int
    let coords: CLLocationCoordinate2D
    let location:String

    private var _title:String?

    override var title: String? {
        get { return _title }
        set { _title = newValue }
    }

    init(eventID:Int, coords:CLLocationCoordinate2D, location:String, title:String?) {

        self.eventID = eventID
        self.coords = coords
        self._title = title
        self.location = location

        super.init()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...