当我想要intValue时,如何防止自己意外使用NSNumber的指针?

Ell*_* P. 2 java autoboxing cocoa objective-c nsnumber

我真正喜欢的Java的一个特性是自动装箱,其中编译器自动在基元和它们的包装类之间进行转换.

我正在Objective-C/Cocoa中编写一个Core Data应用程序,我发现以编程方式处理我的整数属性令人沮丧.原因如下:

//img is a managed object that I have fetched

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];  
Run Code Online (Sandbox Code Playgroud)

如果我碰巧忘记了intValue我有时会做的消息,那么传递给stringWithFormat:它的int 实际上就是指针值.

问题是这种情况完全无声地发生 - 没有编译器错误或警告.有时我会花太多时间调试这个愚蠢,愚蠢的问题.

有没有办法改变我的编程风格或我的编译器设置,以防止我陷入陷阱?

编辑:我不清楚上面这个例子只是我遇到麻烦的地方之一.这是另一个与字符串无关的假设示例:

实体CollegeClass有两个整数属性:courseNumberenrollmentLimit.假设我想比较课程编号:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}
Run Code Online (Sandbox Code Playgroud)

或者类似地,假设我想计算CS部门中所有课程的平均注册限制.

Bre*_*len 7

您可以使用%@将NSNumber直接转换为字符串而不是%d.

它实际上将采用任何基于NSObject的类并将其转换为我认为的字符串.