【问题标题】:Converting int to NSString将 int 转换为 NSString
【发布时间】:2014-02-13 11:43:58
【问题描述】:

我以为我已经将int 转换为NSString 一段时间了,但是每次我运行我的代码时,程序都会进入以下行并崩溃。谁能看到我做错了什么?

NSString *rssiString = (int)self.selectedBeacon.rssi;
UnitySendMessage("Foo", "RSSIValue", [rssiString UTF8String] );

这些行应该将 rssi 值(这是一个 NSInt)转换为字符串,然后以它可以读取的格式将其传递给我的统一对象。

我做错了什么?

【问题讨论】:

  • 使用stringWithFormat:
  • self.selectedBeacon.rssi是什么类型?
  • 尝试 NSString *rssiString = [NSString stringWithFormat:@"%d", (int)self.selectedBeacon.rssi] ;
  • NSString *rssiString = (int)self.selectedBeacon.rssi;. - 真的!,你知道指针的含义以及在objective-c中的类型转换是如何工作的吗,如果没有的话,那就去阅读一些教程吧。

标签: ios objective-c


【解决方案1】:
NSString *rssiString = [NSString stringWithFormat:@"%d", self.selectedBeacon.rssi];

更新:重要的是要记住没有 NSInt 之类的东西。在我的 sn-p 中,我假设您的意思是 NSInteger。

【讨论】:

  • 如果它是 CLBeacon,那么 RSSI 就是这样定义的:@property (readonly, nonatomic) NSInteger rssi;。所以你的代码应该可以工作(但可能会对完成的格式发出警告)。
  • 你是对的。警告将出现在 NSInteger 的 typedef 为 long 的 64 位环境中。然后他必须使用 %ld 格式说明符。
  • @MichałBanasiak Per the documentation,正确的做法是使用 NSInteger 始终使用 %ld 并强制转换为 long。这样,无论在什么平台上运行,您的代码都会做正确的事情。
【解决方案2】:

如果你使用32位环境,就用这个

NSString *rssiString = [NSString stringWithFormat:@"%d", self.selectedBeacon.rssi];

但你不能在 64 位环境下使用它,因为它会给出以下警告。

“NSInteger”类型的值不应用作格式参数;添加 显式转换为“long”

所以使用下面的代码,但是下面会在 32 位环境下给出警告。

NSString *rssiString = [NSString stringWithFormat:@"%ld", self.selectedBeacon.rssi];

如果您想在一行中同时编码(32 位和 64 位),请使用以下代码。只是投射。

NSString *rssiString = [NSString stringWithFormat:@"%ld", (long)self.selectedBeacon.rssi];

【讨论】:

    【解决方案3】:
    NSString *rssiString = [self.selectedBeacon.rssi stringValue];
    

    对于基本数值的简单转换,您可以使用一种称为强制转换的技术。强制转换基于为 C 语言建立的严格规则强制值执行转换。大多数规则规定了数值类型之间的转换(例如,int 和 float 类型的 long 和 short 版本)在此类转换期间的行为方式。

    通过将所需的输出数据类型放在原始值之前的括号中来指定转换。例如,以下将 int 更改为 float:

    float myValueAsFloat = (float)myValueAsInt;
    

    可能影响您的规则之一是,当浮点数或双精度数转换为 int 时,小数点(和小数点)右侧的数字将被删除。不发生舍入。您可以通过修改 runMyCode: 方法来查看自己在 Workbench 中如何进行投射:

    - (IBAction)runMyCode:(id)sender {
        double a = 12345.6789;
        int b = (int)a;
        float c = (float)b;
        NSLog(@"\ndouble = %f\nint of double = %d\nfloat of int = %f", a, b, c);
    }
    

    控制台显示以下日志结果:

    double = 12345.678900
    int of double = 12345
    float of int = 12345.000000
    

    原始链接是http://answers.oreilly.com/topic/2508-how-to-convert-objective-c-data-types-within-ios-4-sdk/

    【讨论】:

      【解决方案4】:

      我想提供一种很好的方式来完成这项工作:

      //For any numbers.
      int iValue;
      NSString *sValue = [@(iValue) stringValue];
      //Even more concise!
       NSString *sValue = @(iValue).stringValue;
      

      【讨论】:

        【解决方案5】:

        如果self.selectedBeacon.rssiint,并且您似乎有兴趣向UnitySendMessage API 提供char * 字符串,则可以跳过NSString 的旅程:

        char rssiString[19];
        sprintf(rssiString, "%d", self.selectedBeacon.rssi);
        UnitySendMessage("Foo", "RSSIValue", rssiString );
        

        【讨论】:

          猜你喜欢
          • 2015-04-30
          • 2010-11-25
          • 2012-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2011-10-08
          相关资源
          最近更新 更多