Почему индексирование массивов в Swift не возвращает необязательное значение? - PullRequest
0 голосов
/ 31 января 2020

При доступе к словарю, такому как [String: Any], тип результата является Необязательным (Any).

При индексировании массива [Any], тип результата - Any, и вызов может выбросить фатальную ошибку.

Есть ли какая-либо причина для такой разницы?

Было бы так приятно разветвлять выполнение с помощью защитной команды let, если let,? и ??, но вместо вас Оборачивать индексирование массива в if data.count <= index. </p>

1 Ответ

2 голосов
/ 31 января 2020

Это в конечном итоге по соображениям производительности:

Обычно отклоненные изменения

...

Строки, символы и типы коллекций

  • Сделать Array<T> возвращение доступа с индексом T? или T! вместо T: текущее поведение массива преднамеренное , поскольку оно точно отражает тот факт, что доступ к массиву за пределами допустимого диапазона лог c ошибка. Изменение текущего поведения замедлит Array доступ к недопустимой степени. Этот топи c встречался несколько раз раз, но вряд ли будет принят.

https://github.com/apple/swift-evolution/blob/master/commonly_proposed.md#strings -характеры-и-сбор- Типы

Хотя ничто не мешает вам бросить свои собственные:

extension Collection {
    subscript(safelyIndex i: Index) -> Element? {
        get {
            guard self.indices.contains(i) else { return nil }
            return self[i]
        }
    }
}

let array = Array(0...10)
let n = [safelyIndex: 3]
print(n as Any) // => Optional(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...