【问题标题】:Swift: "Value of optional type '(Int, Int)?' not unwrapped; did you mean to use '!' or '?'?斯威夫特:“可选类型'(Int,Int)的值?'没有打开;你是不是要使用“!”或者 '?'?
【发布时间】:2017-07-12 17:08:52
【问题描述】:
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 工作原理的新手。有人可以在这种情况下对选项的类型转换和解包进行更多教育吗?

【问题讨论】:

  • 我没有看到代码在哪里加粗。也许尝试添加错误所在的行号。
  • @Grady 这是发布代码中的最后一行if(见星号)。
  • 不相关,但为什么不 var board = [[0,0,0],[0,0,0],[0,0,0]] var turns = 0 并完全删除 init()reset()

标签: swift optional unwrap


【解决方案1】:

问题是由以下几行引起的:

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

一种解决方案是:

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 执行此操作。这样就不会报错了。

【讨论】:

  • 我现在看到,在前面的函数中,我确实使用 let dict = unwrappedDict 格式展开它。这是有道理的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多