Разное поведение индекса (после :) в Collection и String - PullRequest
6 голосов
/ 12 марта 2019

Мне любопытно, почему этот код работает без каких-либо ошибок:

let a = [1]
print(a.index(after: a.endIndex)) // 2

Но если мы попытаемся повторить этот код с типом String, мы получим ошибку:

let s = "a"
print(s.index(after: s.endIndex)) // Fatal error: Can't advance past endIndex

В соответствии с Collection и String документами все они имеют одно и то же утверждение:

Действительный индекс коллекции.i должно быть меньше endIndex.

Это ошибка или все работает как надо?Я пользуюсь swift 4.2.

1 Ответ

2 голосов
/ 12 марта 2019

Если мы перейдем к исходному коду из Array, мы найдем:

public func index(after i: Int) -> Int {
    // NOTE: this is a manual specialization of index movement for a Strideable
    // index that is required for Array performance.  The optimizer is not
    // capable of creating partial specializations yet.
    // NOTE: Range checks are not performed here, because it is done later by
    // the subscript function.
    return i + 1
}

В этом случае мы можем переписать код, подобный этому, и, наконец, получить сбой:

let a = [1]
let index = a.index(after: a.endIndex)
print(a[index])

Итак, все работает "как положено" для типа Array, но мы должны проверить результат index самостоятельно, если мы не хотим, чтобы произошел сбойво время выполнения

PS Полезная ссылка @ MartinR : https://forums.swift.org/t/behaviour-of-collection-index-limitedby/19083/3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...