Я пытаюсь использовать некоторые примеры из книги Swift, а именно пример матрицы, который содержит параметры подстроки. Это код, который у меня есть:
struct Matrix<T> {
let rows: Int, columns: Int
var grid: T[]
var description: String {
return "\(grid)"
}
init(rows: Int, columns: Int, initialValue: T) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: initialValue)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> T {
get {
assert(indexIsValidForRow(row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
В основном это копируется из книги. Основное отличие здесь в этой строке:
struct Matrix<T>
Насколько я могу судить, это говорит компилятору, что мой класс Matrix может хранить значения типа T, заданные кодом, используя этот класс. Теперь я хотел бы убедиться, что тип T можно сравнить, поэтому я могу написать это:
struct Matrix<T: Equatable>
Это может быть полезно, если я хочу сравнить 2 матрицы, что означало бы сравнение их значений. Я также хочу предоставить возможность суммировать две матрицы, поэтому я должен добавить к этой строке протокол, требующий, чтобы тип T был задан пользователем матрицы:
struct Matrix<T: Equatable, "Summable">
Аналогично, я также хотел бы сказать:
struct Matrix<T: Equatable, "Summable", "Multipliable">
Вопрос 1: Какое имя протокола я могу использовать? Как я могу достичь этого?
В соответствующей заметке, чтобы добавить возможности добавления с помощью оператора '+', я должен объявить такую функцию (это также относится к умножению):
@infix func + (m1: Matrix<T>, m2: Matrix<T>) -> Matrix<T> {
// perform addition here and return a new matrix
return result
}
Однако этот код не принят Xcode. Более конкретно, этот ) -> Matrix<T> {
вызывает ошибку: Use of undeclared type 'T'
. То, что я подразумеваю под этим <T>
, состоит в том, что результатом будет матрица, которая имеет тот же тип двух входных матриц, но я, вероятно, полностью заполняю синтаксис.
Вопрос 2: Как я могу предоставить информацию о типе в результате добавления?