Подкласс MKCircle в Swift

Я хотел бы создать подкласс MKCircle (например, MyCircle), добавив еще одно свойство String, назовем его «code». Это свойство не должно быть необязательным и постоянным, поэтому я должен установить его из инициализатора, верно? Конечно, MyCircle также должен получить координату центра и радиус. Эти два свойства доступны только для чтения, поэтому мне также нужно установить их через инициализатор.

В итоге мне нужен инициализатор, который принимает 3 параметра: coordinate, radius и code. Звучит довольно просто, но назначенные Swift и инициализаторы удобства и его правила доставляют мне неприятности.

Проблема заключается в определении MKCircle:

class MKCircle : MKShape, MKOverlay, MKAnnotation, NSObjectProtocol {

    convenience init(centerCoordinate coord: CLLocationCoordinate2D, radius: CLLocationDistance)

    convenience init(mapRect: MKMapRect) // radius will be determined from MAX(width, height)

    var coordinate: CLLocationCoordinate2D { get }
    var radius: CLLocationDistance { get }

    var boundingMapRect: MKMapRect { get }
}

Как видите, инициализатор MKCircle, который принимает coordinate и radius, является удобным инициализатором и, следовательно, не вызывается из инициализаторов моего подкласса. Также свойства доступны только для чтения, поэтому я не могу установить их из инициализаторов моего подкласса или извне.

Я пробовал много вариантов, но кажется, что единственный работающий способ — сделать мое свойство code необязательным, использовать унаследованный удобный инициализатор для установки координаты и радиуса, а затем установить свойство кода, например:

class MyCircle: MKCircle {
    var code: String?
}

overlay = MyCircle(centerCoordinate: coord, radius: radius)
overlay.code = code

Я что-то пропустил? Есть ли способ определить один удобный инициализатор, который в этом случае принимает 3 аргумента?

Спасибо заранее! :)


person sLoPPydrive    schedule 30.09.2014    source источник
comment
Это не отвечает на ваш главный вопрос, но: MKCircle уже имеет два строковых свойства, которые он наследует от MKShape: title и subtitle.   -  person    schedule 30.09.2014


Ответы (1)


Не намного лучше, чем ваше решение, просто обертка вокруг него:

class MyCircle: MKCircle {
    var code: String!

    class func circleAtCenterCoordinate(coord: CLLocationCoordinate2D, radius: CLLocationDistance, code: String)->MyCircle {
        let circ=MyCircle(centerCoordinate: coord, radius: radius)
        circ.code=code
        return circ
    }
}

и используйте его так:

let circ=MyCircle.circleAtCenterCoordinate(CLLocationCoordinate2D, radius: CLLocationDistance, code: String)

Это может быть одной из раздражающих вещей при создании подклассов классов Foundation.

person Community    schedule 02.02.2015