子类的Swift数组处理

erd*_*ser 4 arrays subclass objective-c implicit-conversion swift

如果我有一个声明的变量var gameBoard: [Piece] = [],有没有办法在数组中添加一个Piece被调用的子类Queen

Piece用来代表所有作品.Queen,Pawn,Bishop等都是Piece的子类,应该包含在棋盘上.

我记得在Objective C中经常这样做,其中子类可以用来代替超类.但在我的第一次尝试中,我得到一个错误说

'@lvalue $T11' is not identical to 'Piece`
Run Code Online (Sandbox Code Playgroud)

这不可能了吗?或者是否需要使用一些我现在想不到的泛型?

编辑

这是我的董事会的实施,仅包括相关部分.

struct GameBoard{

    var board: [[Piece]]

    init() {
        board = []
        for _ in 0...7{
            var collumn: [Piece] = []
            for _ in 0...7{
                var piece = Piece(player: .None, board: self)
                collumn.append(piece)
            }
            board.append(collumn)
        }
    }

    subscript(coords:(Int, Int) ) -> Piece {
        return board[coords.1][coords.0]
    }
}
Run Code Online (Sandbox Code Playgroud)

失败的代码是

var board = GameBoard()
var q = Queen(player: .Black, board: board)
board[(4,5)] = q         //Throws the error
board.board[5][4] = q    //Works
Run Code Online (Sandbox Code Playgroud)

在我看来,这两个应该以同样的方式工作.这可能是订阅的问题,但我不完全确定.

Rob*_*ier 5

只是为了跟进您的编辑,这在Swift中运行良好.例如:

class Piece {}
class Bishop : Piece {}
let pieces: [Piece] = [Bishop()]
Run Code Online (Sandbox Code Playgroud)

你有一个不起作用的例子吗?

请注意,当您看到@lvalue $T##错误时,通常意味着您正在尝试修改常量.犯这个错误的一个简单方法是尝试修改传递给你的数组并且你没有标记var.例如,请参阅接收数组给出错误的Swift函数:'@lvalue $ T24'与'CGFloat'不同.