我将项目转换为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循环?
答案 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