Почему IndexSet можно инициализировать отрицательным? - PullRequest
0 голосов
/ 04 сентября 2018

В документации о IndexSet сказано:

Диапазон допустимых целочисленных значений: 0..<INT_MAX-1. Все, что находится вне этого диапазона, является ошибкой.

Но этот код работает нормально:

let indexSet = IndexSet(integer: -1)

И если мы попытаемся использовать -2, произойдет сбой, как и ожидалось.

Почему это случилось? Это ошибка или я что-то пропустил?

Проверено на Xcode 9.4.1, Swift 4.1.

1 Ответ

0 голосов
/ 05 сентября 2018

Это ошибка. Это связано с тем, что инициализатор IndexSet не является неисправным. Здесь - инициализатор, определенный в стандартной библиотеке:

/// Initialize an `IndexSet` with a single integer.
public init(integer: Element) {
    _handle = _MutablePairHandle(NSIndexSet(index: integer), copying: false)
}

Использование целых чисел без знака должно было быть способом, чтобы соответствовать определению:

Диапазон допустимых целочисленных значений: 0..<INT_MAX-1. Что-нибудь снаружи этот диапазон является ошибкой.

Вы можете иметь это расширение для безопасности:

extension IndexSet {
    public init(unsignedInt: UInt) {
        self = IndexSet(integer: Int(unsignedInt))
    }
}

Поэтому, когда вы попытаетесь инициализировать IndexSet с отрицательным целым числом, он выдаст вам правильное сообщение об ошибке:

IndexSet(unsignedInt: -1) //Negative integer '-1' overflows when stored into unsigned type 'UInt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...