将int转换为NSString

问题描述:

我以为我已经将int转换为和NSString,但每次运行我的代码时,程序都会遇到以下几行和崩溃。任何人都可以看到我做错了什么?将int转换为NSString

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

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

我在做什么错?

+2

使用'stringWithFormat:' – Akhilrajtr

+0

是什么类型'self.selectedBeacon.rssi'? – *foe

+0

尝试NSString * rssiString = [NSString stringWithFormat:@“%d”,(int)self.selectedBeacon.rssi]; – larva

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

UPDATE:重要的是要记住有作为NSInt没有这样的事情。在我的片段中,我认为你的意思是NSInteger。

+0

如果它是一个CLBeacon,那么RSSI就是这样定义的:'@property(只读,非原子)NSInteger rssi;'。所以你的代码应该可以工作(但可能会对格式做出警告)。 – Larme

+0

你是对的。警告将出现在NSInteger typedef长的64位环境中。然后他必须使用%ld格式说明符。 –

+0

@MichałBanasiak[根据文档](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW5),与NSInteger做适当的事情总是使用%ld并强制转换。这样,无论您的代码运行在哪个平台上,您的代码都会做正确的事情。 –

NSString *rssiString = [self.selectedBeacon.rssi stringValue]; 

对于基本数值的简单转换,您可以使用一种名为casting的技巧。演员强制执行转换的价值是基于为C语言建立的严格规则。大多数规则规定了数字类型(如int和float类型的长短版本)在这种转换期间的转换方式。

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

float myValueAsFloat = (float)myValueAsInt; 

一个可能影响你的是规则,当一个float或double被转换为int,这个数字到小数点右边(和小数点)被剥离。不发生舍入。你可以看到铸件如何为自己在工作台通过修改runMyCode:方法如下:

- (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/

如果self.selectedBeacon.rssi是一个int,看起来您有兴趣向UnitySendMessage API提供char *字符串,您可以跳过NSString

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

如果使用32位环境中,使用此

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

但你水湿在64位环境中使用它,因为它会给下面的警告。

'NSInteger'类型的值不应该用作格式参数;添加 明确投到'长'

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

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

如果要代码两者(32位& 64位)在一行中,使用下面的代码。只是铸造。

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

我想提供一个甜蜜的方式来做好这项工作:

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