Objective C将数字转换为NSNumber

Reb*_*ial 22 iphone objective-c

为什么这不喜欢编译器,而铸造应该像在c中一样工作,我可以在这里阅读如何在Objective-C中转换对象

[p setAge:(NSNumber*)10];
Run Code Online (Sandbox Code Playgroud)

哪里

- (NSNumber*) age {
    return _age;
}
- (void) setAge: (NSNumber*)input {
    [_age autorelease];
    _age = [input retain];
}
Run Code Online (Sandbox Code Playgroud)

wal*_*lky 50

与您之前的问题形成对称,NSNumber是一种对象类型.您需要通过方法调用来创建它,例如:

[p setAge:[NSNumber numberWithInt:10]];
Run Code Online (Sandbox Code Playgroud)

您当前的代码只是尝试将任意整数强制10转换为指针.永远不要这样做:如果编译器没有警告你,那么你会尝试在内存位置访问一些完全不合适的字节,10就像它们是一个NSNumber对象一样,它们不会.做那些事会导致眼泪.

哦,只是为了抢占下一个明显的问题,请记住,如果你想在一个NSNumber对象中使用该值,你需要通过方法调用得到它,例如:

if ( [[p age] intValue] < 18 )
    ...
Run Code Online (Sandbox Code Playgroud)

(NSNumber是不可变的,我认为它的实现使得相同的值被映射到同一个对象.因此,可能可以通过直接指针比较来避免NSNumber对象之间的值相等.但请不要,因为那将是一个不恰当地依赖于实现细节.请isEqual改用.)


Max*_*sca 29

今天也可以使用简写符号来做到这一点:

[p setAge:@(10)];
Run Code Online (Sandbox Code Playgroud)

  • 如果你只是使用10,你也可以删除括号.即@ 10.如果使用变量名或总和等,您只需要括号... (7认同)

Pab*_*ruz 6

用这个:

[p setAge:[NSNumber numberWithInt:10]];
Run Code Online (Sandbox Code Playgroud)

你不能将整数文字强制10转换为NSNumber*(指向NSNumber).


Lud*_*uda 6

NSNumber *yourNumber = [NSNumber numberWithInt:your_int_variable];
Run Code Online (Sandbox Code Playgroud)


Ste*_*ton 5

因为NSNumber是一个对象,并且原始整数类型中的“ 10”与Java中int和Integer之间的区别非常相似。因此,您需要调用其初始化程序:

[p setAge:[NSNumber numberWithInt:10]
Run Code Online (Sandbox Code Playgroud)