初始化前使用的常量

时间:2018-03-06 23:27:55

标签: swift for-loop

我将项目转换为Swift 3并且我在下面收到此错误:

 fileprivate class func moveAi() -> DataModel {
        let player = pathForPlayer(true)

        let i: Int

        let scope = GameModel.shared.scopeForPlayer(GameModel.shared.topPlayer.id, rival: GameModel.shared.downPlayer.id)


        //for (i = player.count-1; i > 0; i -= 1) { // Original for loop prior to Swift 3
        for i in stride(from: player.count-1, to: 0, by: -1) {

            if scope.contains(player[i]) {
                break
            }
        }

        // Error is on this line
        return DataModel.idConvertToPlayer(player[i], player: true)
    }

//玩家路径

class func pathForPlayer(_ play: Bool) -> [Int] {
        let player = play ? GameModel.shared.topPlayer.id : GameModel.shared.downPlayer.id
        let end = play ? topEnd : downEnd
        return pathForPlayer(Node(data: player, parent: -1), end: end)
    }

如果我在for循环中移动返回,则错误消失,但我仍然需要在这里返回一个值。

有什么建议吗?

更新代码:

    fileprivate class func moveAi() -> DataModel {
        let player = pathForPlayer(true)

        let _: Int // i

        var final: Int?

        let scope = GameModel.shared.scopeForPlayer(GameModel.shared.topPlayer.id, rival: GameModel.shared.downPlayer.id)

        **//for (i = player.count-1; i > 0; i -= 1)** {
        for i in stride(from:player.count-1, to:0, by:-1) {

            final = i

            if scope.contains(player[i]) {
                break
            }
        }

        return DataModel.idConvertToPlayer(player[final!], player: true)
    }

上面的代码没有提供我之前收到的崩溃,但是我遇到了新的崩溃。

最好的描述方式是我的AI会阻止自己完成游戏。

我正在建立棋盘游戏Quoridor。人工智能将围绕它建立围墙,以便它不能再移动。但这并不是每场比赛都会发生的。它发生时非常随机。

它可能基于我如何编写for循环吗? Swift方式是否正确,或者我是否可以深入了解如何在Swift语法中修改注释for循环?

2 个答案:

答案 0 :(得分:1)

你的循环在循环内给出i一个值,但不在外面。循环结束后,i没有值。如果您希望在循环结束后某些值i可用,则需要将其分配给循环外部的某些内容。

一种方法是在循环之前添加它:

var final : Int?

然后在循环中,在某处设置final = i。循环结束后,该值将在final

答案 1 :(得分:0)

你的函数moveAi有2个不同的东西叫i:在函数的外部范围定义的Int常量和在{{1}范围内存在的内部常量循环。它们是分开的。

在for循环中,for i in...隐藏外部常量,并引用从步幅调用中提取的值。

i循环之外,for...in的内部定义超出了范围,不再存在。现在你有了一个从未用值初始化的常量。

您可以像这样重写您的功能:

i