2014-02-13 78 views
5

我以爲我已經將int轉換爲和NSString,但每次運行我的代碼時,程序都會遇到以下幾行和崩潰。任何人都可以看到我做錯了什麼?將int轉換爲NSString

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

這些行應採取RSSI值(這是一個NSInt),將其轉換爲一個字符串,然後把它傳給我的團結對象它可以讀取的格式。

我在做什麼錯?

+2

使用'stringWithFormat:' – Akhilrajtr

+0

是什麼類型'self.selectedBeacon.rssi'? – trojanfoe

+0

嘗試NSString * rssiString = [NSString stringWithFormat:@「%d」,(int)self.selectedBeacon.rssi]; – larva

回答

13
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並強制轉換。這樣,無論您的代碼運行在哪個平臺上,您的代碼都會做正確的事情。 –

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

0

如果self.selectedBeacon.rssi是一個int,看起來您有興趣向UnitySendMessage API提供char *字符串,您可以跳過NSString

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

如果使用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]; 
1

我想提供一個甜蜜的方式來做好這項工作:

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