簡體   English   中英

在Swift中將MKCircle子類化

[英]Subclassing MKCircle in Swift

我想通過添加另一個String屬性來對MKCircle (例如MyCircle )進行子類MKCircle ,我們將其稱為“ 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 coordinateradiusMKCircle初始化程序是一個方便的初始化程序,因此無法從我的子類的初始化程序中調用。 而且屬性是只讀的,因此我不能從子類的初始化程序或外部進行設置。

我嘗試了很多變體,但似乎唯一可行的方法是使我的code屬性成為可選屬性,使用繼承的便捷初始化程序設置坐標和半徑,然后再設置代碼屬性,如下所示:

class MyCircle: MKCircle {
    var code: String?
}

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

我錯過了什么? 在這種情況下,有沒有辦法定義一個使用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類進行子類化的煩人的事情之一。

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM