你好,
我一直在研究第10章,挑战3,陷入困境。虽然我正在寻找解决方案,但我的方法略有不同,我正试图了解正在发生的事情。

// Battleship = write the game engine for a baattleship like game.
struct Coordinate {
    let x: Int
    let y: Int
}

struct ship {
    let origin: Coordinate
    let orientation: String
    let length: Int
    var hits: Int = 0
    
    mutating func isHit(coordinate: Coordinate) -> Bool {
        if orientation == "Right" {
            if origin.y == coordinate.y &&
                coordinate.x >= origin.x &&
                coordinate.x - origin.x < length {
                self.hits += 1
                return true
            }
        } else {
            if origin.x == coordinate.x &&
                coordinate.y >= origin.y &&
                coordinate.y - origin.y < length {
                self.hits += 1
                return true
            }
        }
        return false
    }
    
    func isSunk() -> Bool {
        if self.hits >= length {
            return true
        } else {
            return false
        }
    }
}

struct Board {
    var ships: [ship] = []
    func fire(location: Coordinate) -> Bool {
        for ship in ships {
            if ship.isHit(coordinate: location) { // <-x Cannot use mutating member on immutable value
                print("Hit")
                return true
            }
        }
        return false
    }
}

因此,此代码与本书给出的解决方案非常相似,但我已添加到船舶结构一个变量命中和发行方法,以确定船是否沉没。在此ishit方法中,如果它的命中,则递增令人震惊,如果处于命中,则返回True>=长度。我不得不使ishit方法变得可变,因为它修改了命中变量。

似乎很简单,但是当我写下板结构并尝试使用船舶方法ishit时,我得到和错误“不能在不可变的值上使用突变成员:'船'是”让我们“常量。

花了几个小时通过堆栈溢出和其他网站,但我似乎无法找到与这个问题有关的任何东西。

任何帮助感激。
谢谢,
吉姆卡纳赫

@jimkardach. ship is declared as a constant inside the for loop by default, so you can’t call the isHit(coordinate:) mutable method on it in this case.

In order to fix this, simply define ship as a variable in the for loop and you are good to go:

for var ship in ships {
  // original code
}

如果您有机会,请告诉我如果您有任何其他问题或关于整件事的问题。谢谢!

谢谢。我没有发生在我身上的那个循环默认让,你可以向它添加一个var。

谢谢!
吉姆卡纳赫

1 Like