Objective-C int作为Int32连接到Swift

Objective-C int作为Int32连接到Swift,objective-c,swift,int,nsinteger,int32,Objective C,Swift,Int,Nsinteger,Int32,如果我是正确的,Objective-C的int类型长度取决于平台字长度(即,在64位环境中运行时为64位,在32位环境中运行时为32位) 但是,当将Objective-C接口桥接到Swift时,该类型被桥接为Int32,它明确定义了32位的大小 这是一个错误,还是Objective-C中的int总是占用32位?如果它不是错误,为什么它被桥接为Int32? Objective-C接口示例 -(int)numberOfItems; 它被连接到: func numberOfItems -> I

如果我是正确的,Objective-C的
int
类型长度取决于平台字长度(即,在64位环境中运行时为64位,在32位环境中运行时为32位)

但是,当将Objective-C接口桥接到Swift时,该类型被桥接为
Int32
,它明确定义了32位的大小

这是一个错误,还是Objective-C中的
int
总是占用32位?如果它不是错误,为什么它被桥接为
Int32

Objective-C接口示例

-(int)numberOfItems;
它被连接到:

func numberOfItems -> Int32
当我将方法签名更改为使用
NSInteger
时,它将正确桥接:

-(NSInteger)numberOfItems;

如果我将Objective-C中的
int
更改为
NSInteger
,或者这些类型在Objective-C中的行为方式完全相同,是否有任何危险?
Objective C的
int
(或者正确地说,
C
int
)应该是,因此以32位存储它并不是无效的

如果我是正确的,Objective-C的int类型长度取决于平台字长度(即,在64位环境中运行时为64位,在32位环境中运行时为32位)

那将是,而不是
int
。您可能会混淆它们,因为在
Swift
中的
Int
目标C
NSInteger
的等效类型

您甚至可以在文档中看到它:

typealias NSInteger = Int

目标C的
int
(或者正确地说,
C
int
)应该是,因此以32位存储它并不是无效的

如果我是正确的,Objective-C的int类型长度取决于平台字长度(即,在64位环境中运行时为64位,在32位环境中运行时为32位)

那将是,而不是
int
。您可能会混淆它们,因为在
Swift
中的
Int
目标C
NSInteger
的等效类型

您甚至可以在文档中看到它:

typealias NSInteger = Int

Swift不是从通用(目标-)C桥接而来,而是从苹果(目标-)C桥接而来。在标准C中,
int
的大小只有一个最小界限,而不是确切的大小。但是,Apple(&GNU)编译器遵循特定的数据类型大小模型,来自Apple的:

OSX使用两种数据模型:ILP32(其中整数、长整数和指针为32位量)和LP64(其中整数为32位量,长整数和指针为64位量)。其他类型与32位对应类型等效(除了size_t和其他一些基于长整数或指针大小定义的类型)

因此,在ILP32(用于32位应用程序)和LP64(64位应用程序)中,
int
的大小都是32位。Swift中的等效整数类型为
Int32

关于
NSInteger
相同的参考状态:

除了对基本数据类型的这些更改之外,OS X的各个层还有其他数据类型,这些数据类型在64位环境中会更改大小或基础类型。这些变化中最值得注意的是,NSInteger和NSInteger(Cocoa数据类型)在64位环境中是64位的,在32位环境中是32位的


Swift的等价物是
Int

Swift不是从通用(目标-)C桥接而来,而是从苹果(目标-)C桥接而来。在标准C中
Int
的大小只有一个最小界限,而不是确切的大小。但是,Apple(&GNU)编译器遵循特定的数据类型大小模型,来自Apple的:

OSX使用两种数据模型:ILP32(其中整数、长整数和指针为32位量)和LP64(其中整数为32位量,长整数和指针为64位量)。其他类型与32位对应类型等效(除了size_t和其他一些基于长整数或指针大小定义的类型)

因此,在ILP32(用于32位应用程序)和LP64(64位应用程序)中,
int
的大小都是32位。Swift中的等效整数类型为
Int32

关于
NSInteger
相同的参考状态:

除了对基本数据类型的这些更改之外,OS X的各个层还有其他数据类型,这些数据类型在64位环境中会更改大小或基础类型。这些变化中最值得注意的是,NSInteger和NSInteger(Cocoa数据类型)在64位环境中是64位的,在32位环境中是32位的


Swift的等价物是
Int

Objective-C通常不使用
Int
unsigned Int
,它使用
NSInteger
NSInteger
,因此请使用第二种方法。另外,
NSUInteger
是正确的类型,因为您的项目数不能为负数:)。@特洛伊木马谢谢您的评论。请您详细说明一下“Objective-C通常不使用int或unsigned int”——这些类型来自C吗?我已经任意命名了这些方法,当然在本文中最好使用无符号整数。@特洛伊木马程序在这里应该避免使用
NSUInteger
。虽然项目数不可能为负数,但未签名的数学很容易出错,在Swift中桥接到
UInt
非常不方便。在ObjC中,
count
返回了
NSUInteger
,这是一个错误,在Swift中通过返回
Int
@RobNapier纠正了这个错误。同意你的看法,我实际上遇到了一个错误,因为没有注意到返回的类型是
NSUInteger
:@RobNapier-但我们偏离了原来的问题,我们应该等待一个像“我应该使用无符号类型”这样的例子来讨论类型理论的观点!Objective-C通常不使用
int
unsigned int
,它使用
NSInteger
NSInteger
,因此请使用第二种方法。另外,
NSUInteger
是正确的类型