Это вопрос о стиле программирования в Swift, в частности Int
vs UInt
.
Руководство по языку Swift Programming Language советует программистам использовать общий целочисленный тип со знаком Int
, даже если переменные известны как неотрицательные. Из руководства:
Использовать UInt только тогда, когда вам определенно нужен целочисленный тип без знака с тем же размером, что и размер родного слова платформы. Если это не так, Int является предпочтительным, даже если значения, которые необходимо сохранить, являются неотрицательными. Согласованное использование Int для целочисленных значений помогает взаимодействовать с кодами, избегает необходимости конвертировать между различными типами номеров и соответствует выводу целочисленного типа, как описано в разделе "Безопасность типа и тип".
Однако UInt
будет 32-разрядным без знака в 32-разрядных архитектурах и 64-разрядных беззнаковых в 64-разрядных архитектурах, поэтому нет преимущества для производительности при использовании Int
over UInt
.
Напротив, руководство Swift дает более поздний пример:
пусть возраст = -3
assert (age >= 0, "возраст человека не может быть меньше нуля" )
//это вызывает утверждение, вызываемое, потому что возраст не >= 0
Здесь проблема времени выполнения может быть обнаружена во время компиляции, если код был написан как:
let age:UInt = -3
// this causes a compiler error because -3 is negative
Есть много других случаев (например, что-либо, что будет индексировать коллекцию), где использование UInt
будет ловить проблемы во время компиляции, а не во время выполнения.
Итак, вопрос: является ли совет в звуке руководства Swift Programming Language и полезны при использовании Int
", даже если значения, которые должны быть сохранены, являются неотрицательными" перевешивают преимущества безопасности использования UInt
?
Дополнительная заметка: Используя Swift в течение нескольких недель, теперь ясно, что для взаимодействия с Cocoa UInt
требуется. Например, инфраструктура AVFoundation
использует целые числа без знака, где требуется "подсчет" (количество выборок/кадров/каналов и т.д.). Преобразование этих значений в Int
может привести к серьезным ошибкам, когда значения больше, чем Int.max