【发布时间】:2020-02-07 22:12:19
【问题描述】:
如果我是正确的,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;
func numberOfItems -> Int
如果我将 Objective-C 中的 int 更改为 NSInteger,或者这些类型在 Objective-C 中的行为方式完全相同,会有什么危险吗?
【问题讨论】:
-
Objective-C 通常不使用
int或unsigned int,它使用NSInteger和NSUInteger,所以采用第二种方式。NSUInteger也是正确的类型,因为您不能拥有负数的项目:)。 -
@trojanfoe 感谢您的评论。您能否详细说明“Objective-C 通常不使用 int 或 unsigned int” - 这些类型是否来自 C?我已经任意命名了这些方法,当然在这种情况下最好使用无符号整数。
-
@trojanfoe 你应该避免在这里使用
NSUInteger。虽然不可能有负数的项目,但无符号数学非常容易出错,并且在 Swift 中桥接到UInt非常不方便。在 ObjC 中count返回NSUInteger是一个错误,而在 Swift 中通过返回Int来修复该错误。 -
@RobNapier 同意你的观点,我实际上有一个错误,因为没有注意到返回的类型是
NSUInteger:stackoverflow.com/questions/35265279/… -
@RobNapier - 但我们已经偏离了最初的问题,我们应该等待类似“我应该使用无符号类型”之类的问题来讨论关于类型理论的观点!
标签: objective-c swift int nsinteger int32