Swift:"可选类型'(Int, Int)?'的值未解开包装;你的意思是使用"!"还是"?"?


class Game {
var board: [[Int]]!
var turns: Int!
let coordinates = [1:(0,0), 2:(0,1), 3:(0,2), 4:(1,0), 5:(1,1), 6:(1,2), 7:(2,0), 8:(2,1), 9:(2,2)]
init() {
self.reset()
}
func reset() {
self.board = [[0,0,0],[0,0,0],[0,0,0]]
self.turns = 0
}
func moveByPlayer(player: Int, space: Int) {
let spaceDictionary = [1:(0,0), 2:(0,1), 3:(0,2), 4:(1,0), 5:(1,1), 6:(1,2), 7:(2,0), 8:(2,1), 9:(2,2)]
if let spaceTuple = spaceDictionary[space] {
if self.board[spaceTuple.0][spaceTuple.1] == 0 {
self.board[spaceTuple.0][spaceTuple.1] = player
}
}
print(self.board)
self.turns = self.turns + 1
}
func checkForWin(space: Int) {
let lines = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7]]
for index in 0..<lines.count {
let x = self.coordinates[lines[index][0]]
let y = self.coordinates[lines[index][1]]
let z = self.coordinates[lines[index][2]]
**if(self.board[x.0][x.1] != 0 && self.board[x.0][x.1] == self.board[y.0][y.1] && self.board[x.0][x.1] == self.board[z.0][z.1]){
return self.board[x.0][x.1]**
}
}
}
}

我收到一个错误,指出:

"可选类型的值(Int、Int(?未打开包装">

其中代码应该加粗但没有格式化。我在前面的函数实现中有一个非常相似的"解包"字典实现,但没有收到错误。我是学习 Swift 工作原理的新手。在这种情况下,有人可以对类型转换和可选解包进行更多教育吗?

问题是由以下行引起的:

let x = self.coordinates[lines[index][0]]
let y = self.coordinates[lines[index][1]]
let z = self.coordinates[lines[index][2]]

xyz都是可选的,因为字典在按键查找值时总是返回可选值,因为即使您知道该键可能存在,它们也可能不存在。

一种解决方案是执行以下操作:

if let x = self.coordinates[lines[index][0]], let y = self.coordinates[lines[index][1]], let z = self.coordinates[lines[index][2]] {
if self.board[x.0][x.1] != 0 && self.board[x.0][x.1] == self.board[y.0][y.1] && self.board[x.0][x.1] == self.board[z.0][z.1] {
return self.board[x.0][x.1]
}
}

这确保了xyz被正确解开包装。

另一种选择是使用??运算符。改变:

let x = self.coordinates[lines[index][0]]

到某行:

let x = self.coordinates[lines[index][0]] ?? (0, 0)

也为yz执行此操作。然后你不会得到错误。

最新更新