我正在定义一个协议,为了抽象目的,它有一个“下标”函数,具有getter和setter。然后我定义了一个实现该协议的类。
问题简述:如果我在类的对象上使用下标(作为左值,因此使用setter),则一切都按预期工作。如果我在仅声明为协议类型的对象上执行它,则会出现“无法将结果分配给此表达式”的错误。
问题详述:我有一个Int类型的棋盘,这是一个二维矩阵。我通过BoardType协议公开了Board类型。
现在,如果我按照以下方式操作,它可以正常工作:
为什么?
问题简述:如果我在类的对象上使用下标(作为左值,因此使用setter),则一切都按预期工作。如果我在仅声明为协议类型的对象上执行它,则会出现“无法将结果分配给此表达式”的错误。
问题详述:我有一个Int类型的棋盘,这是一个二维矩阵。我通过BoardType协议公开了Board类型。
protocol BoardType {
var width: Int { get }
var height: Int { get }
subscript(x: Int, y: Int) -> Int { get set }
}
class Board: BoardType {
let width, height: Int
var matrix: Array2D<Int>
init(width: Int, height: Int) {
self.width = width
self.height = height
matrix = Array2D<Int>(cols: width, rows: height, defaultValue: 0)
}
subscript(x: Int, y: Int) -> Int {
get {
return matrix[x, y]
}
set {
matrix[x, y] = newValue
}
}
}
Array2D的实现是标准的:
class Array2D<T> {
var cols: Int, rows: Int
var matrix: [T]
init(cols: Int, rows:Int, defaultValue: T) {
self.cols = cols
self.rows = rows
matrix = Array(count: cols*rows, repeatedValue: defaultValue)
}
subscript(x: Int, y: Int) -> T {
get {
return matrix[cols * y + x]
}
set {
matrix[cols * y + x] = newValue
}
}
func colCount() -> Int {
return self.cols
}
func rowCount() -> Int {
return self.rows
}
}
现在,如果我按照以下方式操作,它可以正常工作:
let board = Board(width: 4, height: 4)
board[1, 1] = 10
然而,如果我使用原型,就会出现错误。
let board : BoardType = Board(width: 4, height: 4)
board[1, 1] = 10
为什么?