我想通过添加另一个字符串属性来继承MKCircle (例如MyCircle),让我们称之为"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 }
}正如您所看到的,接受coordinate和radius的MKCircle初始化器是一个方便的初始化器,因此不能从我的子类的初始化器中调用。此外,属性是只读的,所以我不能从我的子类的初始化器或外部设置它们。
我尝试了许多变体,但似乎唯一有效的方法是将我的code属性设为可选,使用继承的方便初始化器来设置坐标和半径,然后设置代码属性,如下所示:
class MyCircle: MKCircle {
var code: String?
}
overlay = MyCircle(centerCoordinate: coord, radius: radius)
overlay.code = code我错过了什么吗?在这种情况下,有没有办法定义一个带有3个参数的方便初始化器?
非常感谢!:)
发布于 2015-02-03 04:25:19
比你的解决方案好不了多少,只是包装一下:
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)这可能是基础类子类化的一件烦人的事情。
发布于 2019-03-06 20:10:10
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
}
}https://stackoverflow.com/questions/26117350
复制相似问题