我以为我已经将int
转换为NSString
一段时间了,但每次运行我的代码时,程序都会转到以下行并崩溃。谁能看到我做错了什么?
NSString *rssiString = (int)self.selectedBeacon.rssi;
UnitySendMessage("Foo", "RSSIValue", [rssiString UTF8String] );
这些行应该使用rssi值(这是一个NSInt)将其转换为字符串,然后以它可以读取的格式将其传递给我的unity对象。
我做错了什么?
答案 0 :(得分:13)
NSString *rssiString = [NSString stringWithFormat:@"%d", self.selectedBeacon.rssi];
更新:重要的是要记住没有NSInt这样的东西。在我的片段中,我认为你的意思是NSInteger。
答案 1 :(得分:4)
如果您使用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];
答案 2 :(得分:2)
NSString *rssiString = [self.selectedBeacon.rssi stringValue];
对于基本数值的简单转换,您可以使用称为强制转换的技术。强制转换强制值根据为C语言建立的严格规则执行转换。大多数规则规定了数字类型之间的转换(例如,int和float类型的长版本和短版本)在这种转换过程中的行为。
通过将所需的输出数据类型放在原始值之前的括号中来指定强制转换。例如,以下内容将int更改为float:
float myValueAsFloat = (float)myValueAsInt;
可能影响到你的一个规则是,当一个float或double被强制转换为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/
答案 3 :(得分:2)
我想提供一个很好的方式来完成这项工作:
//For any numbers.
int iValue;
NSString *sValue = [@(iValue) stringValue];
//Even more concise!
NSString *sValue = @(iValue).stringValue;
答案 4 :(得分:0)
如果self.selectedBeacon.rssi
是int
,并且您似乎有兴趣向char *
API提供UnitySendMessage
字符串,则可以跳过NSString
行程1}}:
char rssiString[19];
sprintf(rssiString, "%d", self.selectedBeacon.rssi);
UnitySendMessage("Foo", "RSSIValue", rssiString );