2009-08-27 13 views
37

Dlaczego nie działa to:Przekazywanie zmiennej NSInteger do NSMutableDictionary lub NSMutableArray

NSInteger temp = 20; 
[userSettingsFromFile setObject:temp forKey:@"aTemp"]; 

ale to robi:

[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"]; 

Jak mogę użyć zmiennej NSInteger?

+0

Twój tytuł jest błędny - w zależności od próbki kodu, używasz NSMutableDictionary, a nie NSMutableArray. –

+0

Edytowałem tytuł. W każdym razie problem może również pojawić się w NSMutableArray iw ogóle w zbiorach. – mouviciel

Odpowiedz

90

NSInteger nie jest obiektem - jest po prostu typecastem dla int dla wersji 32-bitowej lub long dla wersji 64-bitowej. Ponieważ NSDictionary może przechowywać tylko obiekty, musisz zawinąć liczbę całkowitą do obiektu, zanim będzie można go zapisać. Spróbuj tego:

NSInteger temp = 20; 
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
         forKey:@"aTemp"]; 
+2

Aby odzyskać go z NSDictionay, musisz użyć czegoś takiego jak NSInteger temp = [[userSettingsFromFile objectForKey: @ "aTemp"] integerValue]; – JScarry

2

Cokolwiek przechodzi przez setObject musi pochodzić z NSObject. NSInteger nie jest, jest to prosta int typedef. W twoim drugim przykładzie użyłeś NSString, który pochodzi od NSObject.

5

Aby przechowywać numery w kolekcjach, należy je opakować w instancji NSNumber.

double aDouble = 20.3d; 
NSInteger anInt = 20; 

NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble]; 
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt]; 

NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil]; 
0

Korekta: Cokolwiek jest przepuszczany przez setObject: nie muszą pochodzić z klasy NSObject, ale to musi być zgodne z protokołem NSObject, który definiuje retain i release.

Może to być mylące, ale klasy i protokoły mają różne przestrzenie nazw. I istnieje zarówno klasa, jak i protokół o nazwie NSObject, klasa NSObject jest zgodna z protokołem NSObject. Istnieje jeszcze jedna klasa root, klasa NSProxy, która również jest zgodna z protokołem NSObject.

Jest to ważne, ponieważ w przeciwnym razie serwery proxy nie mogłyby być używane w kolekcjach i pulach automatycznej dystrybucji, a jednocześnie mają lekką klasę proksy serwera proxy.

0

NSInteger jest synonimem długi integer.What następujący sposób NSInteger zostało określone

#if __LP64__ || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

NSNumber jest klasą Cel C, podklasa NSValue specyficzne. Możesz utworzyć obiekt NSNumber z podpisanego lub unsigned char, krótkiego int, int, long int, long long int, float, double lub BOOL

Jednym z podstawowych różnic jest to, że możesz używać NSNumber w kolekcjach, takich jak NSArray, gdzie wymagany jest obiekt. Na przykład, jeśli chcesz dodać do pływaka w NSArray, byś najpierw trzeba utworzyć obiekt NSNumber z pływaka:

float percentage = 40.5; 

... // Utwórz obiekt NSNumber, który może być wprowadzony do teraz NSArray

NSNumber *percentageObject = [NSNumber numberWithFloat:percentage]; 
0

wystarczy użyć: $(variable) składnia do konwersji prymitywny rodzaj sprzeciwu.

0

Odwołana do odpowiedzi @Matt Ball: NSInteger nie jest obiektem - po prostu jest typecast na int na poziomie 32-bitowym lub długim na 64-bitowym.Ponieważ NSDictionary może przechowywać tylko obiekty, musisz zawinąć integer w obiekt, zanim będzie można go zapisać.

Tak więc, w przypadku Swift, to jak to zrobić:

let temp:NSInteger = yourInteger.hashValue 
Powiązane problemy