2014-09-30 2 views
5

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

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

Проблема определение 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 } 
} 

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

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

class MyCircle: MKCircle { 
    var code: String? 
} 

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

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

Большое спасибо! :)

+0

Это не отвечает на ваш главный вопрос, но: MKCircle уже имеет два свойства строки, которые он наследует от MKShape: 'title' и' subtitle'. – Anna

ответ

3

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

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 классы.