Jak przekonwertować NSInteger na typ danych NSString?


137

Jak konwertować NSIntegerna NSStringtyp danych?

Wypróbowałem następujące, gdzie miesiąc to NSInteger:

  NSString *inStr = [NSString stringWithFormat:@"%d", [month intValue]];

Odpowiedzi:


267

NSIntegers nie są obiektami, na które rzucasz je long, aby dopasować definicję obecnej architektury 64-bitowej:

NSString *inStr = [NSString stringWithFormat: @"%ld", (long)month];


11
Próbowałem tego, ale otrzymywałem ostrzeżenie Format specifies type 'int' but the argument has type 'NSInteger *'(aka 'int *'). Zamiast według docs firmy Apple , poszedłem zNSString *inStr = [NSString stringWithFormat:@"%d", (int)month];
Steven

8
Zwróć uwagę, że w przypadku procesorów 64-bitowych, takich jak nowy układ A7, jeśli Twoja aplikacja jest kompilowana do wersji 64-bitowej, NSInteger jest w rzeczywistości długim, a nie int. Wykonanie rzutowania (int) month byłoby destrukcyjne na platformach 64-bitowych w przypadku ogólnym. Jeśli celujesz wyłącznie w platformy Apple, preferuj sposób Objective-C, jak w odpowiedzi Aleksey Kozhevnikov, lub coś podobnego, co będzie działać zarówno z int, jak i long - np. Long ;-) Przykład, choć bez znaku (czyli nieujemny) jest w Andreas Odpowiedź Leya.
Louis St-Amour,

1
@Steven Próbowałem usunąć odpowiedź, aby aktualne, bardziej odpowiednie, wypłynęły i zostały zaakceptowane, ale najwyraźniej zaakceptowanych odpowiedzi nie można usunąć. Dlatego starałem się przynajmniej dostosować jego zawartość, aby dostarczyć jak najwięcej użytecznych informacji dla osób poszukujących szybkiego rozwiązania, które nie powoduje ostrzeżeń.
luvieere,

Dokumentacja @luvieere Apple jasno wyjaśnia, jak traktować NSInteger w łańcuchach formatujących. Zaktualizuj swoją odpowiedź, aby zastosować się do tej porady.
Nikolai Ruhe

2
[@(integerValue) stringValue]to czystsze podejście.
Zorayr,


76

Nowoczesne Objective-C

An NSIntegerma metodę, stringValuektórej można używać nawet z literałem

NSString *integerAsString1 = [@12 stringValue];

NSInteger number = 13;
NSString *integerAsString2 = [@(number) stringValue];

Bardzo prosty. Prawda?

Szybki

var integerAsString = String(integer)

8

%zddziała dla NSIntegers ( %tudla NSUInteger) bez rzutowań i bez ostrzeżeń na architekturach 32-bitowych i 64-bitowych. Nie mam pojęcia, dlaczego nie jest to „ zalecany sposób ”.

NSString *string = [NSString stringWithFormat:@"%zd", month];

Jeśli interesuje Cię, dlaczego to działa, zobacz to pytanie .


5

Łatwy sposób:

NSInteger value = x;
NSString *string = [@(value) stringValue];

Tutaj @(value)konwertuje dane NSIntegerdo NSNumberobiektu, dla którego można wywołać żądaną funkcję stringValue.


2

Podczas kompilacji z obsługą dla arm64, nie spowoduje to wygenerowania ostrzeżenia:

[NSString stringWithFormat:@"%lu", (unsigned long)myNSUInteger];

1

Możesz też spróbować:

NSInteger month = 1;
NSString *inStr = [NSString stringWithFormat: @"%ld", month];

0

Odpowiedź została udzielona, ​​ale pomyśl, że w niektórych sytuacjach będzie to również interesujący sposób na uzyskanie ciągu znaków od NSInteger

NSInteger value = 12;
NSString * string = [NSString stringWithFormat:@"%0.0f", (float)value];

0

W takim przypadku NSNumber może Ci się przydać.

NSString *inStr = [NSString stringWithFormat:@"%d", 
                    [NSNumber numberWithInteger:[month intValue]]];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.