2

Swift の構造体には、関数を含めることができ、拡張機能を含めることができます。涼しい!この関数をより多くのクラスで利用できるようにし、引数の受け渡しを減らすための巧妙な方法のように見えます。マップ ビュー コントローラーで関数が最初に表示された方法を次に示します。

    func expandTrackRectToCoordinate(coordinate : CLLocationCoordinate2D) {

    let point = MKMapPointForCoordinate(coordinate)
    let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)

    if MKMapRectIsNull(trackRect) {
        trackRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)
    } else {
        trackRect = MKMapRectUnion(trackRect, newRect)
    }
}

trackRectクラスの MKMapRect メンバーでした。

MKMapRect は展開されて各ポイントが含まれるようになり、必要に応じてマップをリージョン全体にリセットしてすべてのポイントを表示できるようになります。

これを MKMapRect の拡張機能にしようとしました (部分的 - エラーまで表示されます):

extension MKMapRect {

func expandToIncludeCoordinate(coordinate : CLLocationCoordinate2D) {

    let point = MKMapPointForCoordinate(coordinate)
    let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)

    if MKMapRectIsNull(self) {
        self.origin = point       <-------- Cannot assign to 'origin' in 'self'
        self.size = CGSizeZero
    } else {

自分自身に代入できるとは思っていませんでしたが、構造体のメンバーに代入できるとは思っていました。これはどのように行うことができますか?

4

1 に答える 1

5

Swift の構造体は、メソッドを特に次のようにマークしない限り、一般に不変であると見なされますmutating

extension MKMapRect {

    mutating func expandToIncludeCoordinate(coordinate : CLLocationCoordinate2D) {

        let point = MKMapPointForCoordinate(coordinate)
        let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)

        if MKMapRectIsNull(self) {
            self.origin = point

            // Another problem here is that CGSize is not the same as MKMapSize
            self.size = MKMapSize(width: 0, height: 0)
        } else {
            ...
            ...
        }
    }
}

参照

于 2015-02-23T04:35:36.193 に答える