Я пишу собственную коллекцию под названием TriangularArray<T>
.Он представляет собой такую структуру:
x
x x
x x x
x x x x
x x x x x
, где каждый x
является элементом в массиве.Я могу получить доступ к элементам с номером строки и номером индекса, оба начинаются с нуля.Например, доступ к (4, 2) из следующего:
a
b c
d e f
g h i j
k l m n o
приведет к m
(5-я строка, третье значение в этой строке).
Я использовал [[T]]
в качестве резервного массива, и я написал нижний индекс следующим образом:
subscript(_ row: Int, _ index: Int) -> T? {
get {
// innerArray is the [[T]] used for backing
if row < 0 || row >= innerArray.count {
return nil
}
if index < 0 || index > row {
return nil
}
return innerArray[row][index]
}
set {
if row < 0 || row >= innerArray.count {
return
}
if index < 0 || index > row {
return
}
innerArray[row][index] = newValue!
}
}
Логика заключается в том, что нижний индекс вернет nil
, если вы получите доступ к несуществующей строке и индексу, например (1, 3),Однако, возвращая индекс T?
, newValue
в установщике также становится необязательным, и я вынужден принудительно развернуть его.
Я действительно хочу проверить во время компиляции такие вещи:
triangularArray[0, 0] = nil // this should be a compile time error
Я пытался найти это в Google, но нашел только этот вопрос , который очень устарел.Конечно, мы можем добиться большего успеха в Swift 4.2, верно?