Objective-C int соединяется как Int32 со Swift - PullRequest
1 голос
/ 10 октября 2019

Если я прав, длина типа int в Objective-C зависит от длины слова платформы (т. Е. Она равна 64 битам при работе в 64-битной среде и 32-битной при работе в 32-битной среде).

Однако при соединении интерфейса Objective C со Swift этот тип соединяется как Int32, который явно определяет размер 32 бита.

Является ли это ошибкой, илиint в Objective-C всегда занимает 32 бита? Если это не ошибка, почему он соединен как Int32?

Пример интерфейса Objective-C

-(int)numberOfItems;

, который соединяется с:

func numberOfItems -> Int32

Когда я изменяю сигнатуру метода на использование NSInteger, он правильно соединяется:

-(NSInteger)numberOfItems;
func numberOfItems -> Int

Есть ли опасность, если я изменю int в Objective-Cк NSInteger, или эти типы ведут себя точно так же в Objective-C?

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Объектив C int (или, если быть точным, C int) должен быть размером не менее 16 бит , поэтому его сохранение в 32 битах недопустимо. Вероятно, в реализации Apple это всегда 32 бита для int.

Если я прав, длина типа int в Objective-C зависит от длины слова платформы (т.е. это64-разрядный при работе в 64-разрядной среде и 32-разрядный при работе в 32-разрядной среде.

Это будет NSInteger, а не int,Вы можете их запутать, потому что Swift Int эквивалентен Objective C NSInteger.

Вы даже можете увидеть это в документах:

typealias NSInteger = Int
2 голосов
/ 10 октября 2019

Swift соединяется не с универсального (Objective-) C, а с Apple (Objective-) C. В стандарте C размер int имеет только минимальный предел, а не точный размер. Однако компиляторы Apple (& GNU) следуют определенным моделям для размеров типов данных из 64-разрядного руководства по переходам Apple :

OS X использует две модели данных: ILP32 (в которойцелые числа, длинные целые числа и указатели являются 32-разрядными величинами) и LP64 (в которых целые числа являются 32-разрядными величинами, а длинные целые числа и указатели являются 64-разрядными величинами). Другие типы эквивалентны их 32-битным аналогам (за исключением size_t и некоторых других, которые определяются на основе размера длинных целых или указателей).

То есть в обоих ILP32 (используется для 32-битовые приложения) и LP64 (64-битные приложения) размер int составляет 32 бита. Эквивалентный целочисленный тип в Swift - Int32.

Относительно NSInteger одинаковых ссылочных состояний:

В дополнение к этим изменениям базовых типов данных, различные уровни ОСX имеет другие типы данных, которые изменяют размер или базовый тип в 64-битной среде. Наиболее заметным из этих изменений является то, что NSInteger и NSUInteger (типы данных Cocoa) являются 64-разрядными в 64-разрядной среде и 32-разрядными в 32-разрядной среде.

Эквивалент Swift равен Int.

...