自动拳击原语

Jon*_*han 16 objective-c

我似乎无法弄清楚如何让Objective-c自动封装我的原语.

我以为我能够做到以下几点

float foo = 12.5f;
NSNumber* bar;

bar = foo;
Run Code Online (Sandbox Code Playgroud)

但是我发现我习惯了更冗长的方法

float foo = 12.5f;
NSNumber* bar;

bar = [NSNumber numberWithFloat:foo];
Run Code Online (Sandbox Code Playgroud)

我做错了还是这样做得好?

Bar*_*ark 29

不幸的是,Objective-C不会对原始类型进行自动装箱或拆箱NSNumber.当这样说时,可能很清楚为什么:Objective-C没有NSNumberCocoa Foundation框架中的类的概念.作为C的一个小超集,Objective-C没有"本机"数字对象类型 - 只是本机C类型.

编辑2012年8月 从Xcode 4.4(和LLVM 4.0)开始,您现在可以使用一些语法糖来包装数字.按照你的例子,这些"盒装表达式"现在可以工作:

float foo = 12.5f;
NSNumber* bar;

bar = @(foo);
bar = @12.5f;
Run Code Online (Sandbox Code Playgroud)

  • 我可能会说"不方便"而不是"不幸".使用自动(非)拳击的语言并非没有问题 - 实际上,其中许多语言很难被发现并且可能导致奇怪的问题.例如,Effective Java和Java Puzzler专门用了几页来解决关于数字在各种情况下如何出乎意料地行为的混淆.拥有自动装箱会很方便,但是将它添加到语言本身(正如你所指出的)将是非常重要的,并且可能充满了隐藏的危险. (6认同)
  • 谁回来2年后调整他们的答案?惊人.我正在寻找新的语法,谢谢!所以当然没有自动拆箱,对吗? (5认同)

nsc*_*hum 11

Clang 3.1和Apple LLVM 4.0(包含在Xcode 4.4中)支持一个新的拳击功能:http://clang.llvm.org/docs/ObjectiveCLiterals.html#objc_boxed_expressions

你现在可以写:

NSNumber *bar = @(foo);
Run Code Online (Sandbox Code Playgroud)

以及:

NSNumber *bar = @12.5F;
Run Code Online (Sandbox Code Playgroud)

所以它变得更好了.:)