Почему руководство по языку Swift предлагает использовать Int «даже когда известно, что значения неотрицательны»?

Это вопрос о стиле программирования в Swift, в частностиInt противUInt.

Руководство по языку программирования Swift рекомендует программистам использовать общий целочисленный тип со знакомInt даже когда известно, что переменные неотрицательны. Отгид:

Используйте UInt только тогда, когда вам нужен целочисленный тип без знака с тем же размером, что и собственный размер слова платформы. Если это не так, предпочтительным является Int, даже когда известно, что значения, которые должны быть сохранены, неотрицательны. Последовательное использование Int для целочисленных значений способствует совместимости кода, устраняет необходимость преобразования между различными типами чисел и соответствует выводу целочисленных типов, как описано в разделе Безопасность типов и Вывод типов.

Тем не мение,UInt будет 32-разрядным без знака на 32-разрядной архитектуре и 64-разрядным без знака на 64-разрядной архитектуре, поэтому использование производительности не дает никаких преимуществInt надUInt.

Руководство Swift, напротив, приводит более поздний пример:

пусть возраст = -3
утверждать (age> = 0, «возраст человека не может быть меньше нуля»)
// это вызывает утверждение, потому что age не> = 0

Здесьвремя выполнения проблема может быть поймана вкомпилировать время, если код был написан как:

let age:UInt = -3  
// this causes a compiler error because -3 is negative

Есть много других случаев (например, все, что будет индексировать коллекцию), где использованиеUInt будет ловить проблемы во время компиляции, а не во время выполнения.

Таким образом, вопрос: является ли совет в звуковом руководстве по Swift Programming Language преимуществами использованияInt «даже когда известно, что сохраняемые значения неотрицательны» перевешивают преимущества безопасности использованияUInt?

Дополнительное примечание: Пользуясь Swift в течение нескольких недель, стало ясно, что дляКакао UInt необходимо. Например,AVFoundation фреймворк использует целые числа без знака везде, где требуется "число" (количество выборок / кадров / каналов и т. д.). Преобразование этих значений вInt может привести к серьезным ошибкам, когда значения большеInt.max

Ответы на вопрос(2)

Ваш ответ на вопрос