sLo*_*ive 8 inheritance initializer mapkit ios swift
我想通过添加另一个String属性来子类化MKCircle(例如MyCircle),让我们称之为" code".这个属性不是可选的和常量的,所以我必须从初始化器设置它,对吧?当然MyCircle还应该得到中心坐标和半径.这两个属性是只读的,所以我还需要通过初始化程序设置它们.
最后,我需要一个初始化的是需要3个参数:coordinate,radius和code.听起来很简单但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 }
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的初始化的MKCircle那个需要coordinate和radius是一个方便initalizer,因此没有从我的子类的初始化调用.此属性也是只读的,因此我无法从子类的初始化程序或外部设置它们.
我尝试了很多变化,但似乎唯一可行的方法是使我的code属性成为可选,使用继承的便利初始化器来设置坐标和半径,然后设置代码属性,如下所示:
class MyCircle: MKCircle {
var code: String?
}
overlay = MyCircle(centerCoordinate: coord, radius: radius)
overlay.code = code
Run Code Online (Sandbox Code Playgroud)
我错过了什么?有没有办法定义一个单一的便利初始化器,在这种情况下需要3个参数?
提前谢谢了!:)
小智 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
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
let circ=MyCircle.circleAtCenterCoordinate(CLLocationCoordinate2D, radius: CLLocationDistance, code: String)
Run Code Online (Sandbox Code Playgroud)
这可能是子类化基础类的烦人的事情之一。