Swift结构扩展函数 - "无法分配到' origin'在' self'"

时间:2015-02-23 04:05:13

标签: swift swift-extensions

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 {

我没想到能够分配给自己,但我确实希望能够分配给结构的成员。怎么办呢?

1 个答案:

答案 0 :(得分: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 {
            ...
            ...
        }
    }
}

Reference