【问题标题】:Subclassing MKCircle in Swift在 Swift 中继承 MKCircle
【发布时间】:2014-11-24 21:01:33
【问题描述】:

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

最后我需要一个带有 3 个参数的初始化程序:coordinateradiuscode。听起来很简单,但 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 }
}

正如您所见,MKCircle 的初始化程序采用 coordinateradius 是一个便利初始化程序,因此不能从我的子类的初始化程序调用。此外,这些属性是只读的,因此我无法从子类的初始化程序或外部设置它们。

我尝试了很多变体,但似乎唯一可行的方法是将我的 code 属性设为可选,使用继承的便利初始化程序设置坐标和半径,然后设置 code 属性,如下所示:

class MyCircle: MKCircle {
    var code: String?
}

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

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

提前非常感谢! :)

【问题讨论】:

  • 这并不能回答您的主要问题,但是:MKCircle 已经有两个从 MKShape 继承的字符串属性:titlesubtitle

标签: ios inheritance swift mapkit initializer


【解决方案1】:
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
    }
}

【讨论】:

    【解决方案2】:

    没有比你的解决方案好多少,只是一个包装器:

    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 类的烦人事情之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多