在Swift中对MKCircle进行子类化

时间:2014-09-30 09:30:28

标签: ios inheritance swift mapkit initializer

我想通过添加另一个String属性来继承MKCircle(例如MyCircle),我们称之为“code”。这个属性不是可选的和常量的,所以我必须从初始化器设置它,对吧?当然MyCircle也应该得到中心坐标和半径。这两个属性是只读的,所以我还需要通过初始化程序设置它们。

最后,我需要一个带有3个参数的初始值设定项:coordinateradiuscode。听起来很简单,但Swifts指定和便利的initalizers及其规则让我在这里度过了难关。

问题是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的初始值设定项coordinateradius是一个方便的initalizer,因此无法从我的子类的初始值设定项中调用。此外,属性是只读的,因此我无法从子类的初始化程序或外部设置它们。

我尝试了很多变化,但似乎唯一可行的方法是使我的code属性成为可选项,使用继承的便捷初始化程序设置坐标和半径,然后设置代码属性,如这样:

class MyCircle: MKCircle {
    var code: String?
}

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

我错过了什么吗?有没有办法定义一个单一的便利初始化器,在这种情况下需要3个参数?

非常感谢提前! :)

2 个答案:

答案 0 :(得分: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)

这可能是继承基础类的烦人之处。

答案 1 :(得分:0)

class MyCircle: MKCircle {

    private(set) var code: String?

    private override init() {
        super.init()
    }

    static func Instance(center: CLLocationCoordinate2D, radius: CLLocationDistance, code: String?) -> MyCircle {
        let instance = MyCircle(center: center, radius: radius)
        instance.code = code
        return instance
    }
}