2009-08-27 37 views
37

Tại sao điều này không làm việc:Đi qua biến NSInteger để NSMutableDictionary hoặc NSMutableArray

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

nhưng điều này không:

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

Làm thế nào tôi có thể sử dụng các biến NSInteger?

+0

Tiêu đề của bạn là không chính xác - theo mẫu mã của bạn, bạn đang sử dụng một NSMutableDictionary, không phải là một NSMutableArray. –

+0

Tôi đã chỉnh sửa tiêu đề. Dù sao, vấn đề cũng có thể phát sinh với NSMutableArray và với bất kỳ bộ sưu tập nói chung. – mouviciel

Trả lời

90

NSInteger không phải là một đối tượng - nó chỉ được nhập vào int trên 32 bit hoặc long trên 64 bit. Vì NSDictionary chỉ có thể lưu trữ các đối tượng, bạn cần bọc số nguyên vào một đối tượng trước khi bạn có thể lưu trữ nó. Hãy thử điều này:

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

Để đưa nó trở lại khỏi NSDictionay, bạn cần sử dụng một cái gì đó như NSInteger temp = [[userSettingsFromFile objectForKey: @ "aTemp"] integerValue]; – JScarry

2

Bất kể bạn vượt qua setObject phải được lấy từ NSObject. NSInteger là không, đó là một typedef int đơn giản. Trong ví dụ thứ 2 của bạn, bạn sử dụng NSString, có nguồn gốc từ NSObject.

5

Để lưu trữ số trong bộ sưu tập, bạn phải bao bọc số trong một ví dụ 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

Correction: Dù là đi qua setObject: không cần phải được bắt nguồn từ lớp NSObject, nhưng nó phải phù hợp với NSObject giao thức, định nghĩa retainrelease.

Có thể khó hiểu, nhưng các lớp và giao thức có các không gian tên khác nhau. Và có cả một lớp và một giao thức có tên là NSObject, lớp NSObject tuân theo giao thức NSObject. Có thêm một lớp gốc, lớp NSProxy cũng tuân theo giao thức NSObject.

Điều này rất quan trọng, bởi vì nếu không proxy không thể được sử dụng trong bộ sưu tập và bể tự động phát hành, trong khi vẫn có lớp gốc proxy nhẹ.

0

NSInteger là từ đồng nghĩa với integer.What lâu sau là cách NSInteger được định nghĩa:

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

NSNumber là một lớp Objective-C, một lớp con của NSValue được cụ thể. Bạn có thể tạo một đối tượng NSNumber từ một ký tự char hoặc unsigned, int ngắn, int, long int, dài int, float, double hoặc BOOL

Một trong những khác biệt chính là bạn có thể sử dụng NSNumber trong bộ sưu tập, chẳng hạn như NSArray, nơi một đối tượng được yêu cầu. Ví dụ, nếu bạn cần phải thêm một phao vào một NSArray, trước tiên bạn cần phải tạo ra một đối tượng NSNumber từ float:

float percentage = 40.5; 

... // Tạo đối tượng NSNumber, mà bây giờ có thể được chèn vào một NSArray

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

chỉ cần sử dụng: $(variable) cú pháp để chuyển đổi kiểu gốc thành đối tượng.

0

Được đề cập đến câu trả lời của @Matt Ball: NSInteger không phải là một đối tượng - nó đơn giản được nhập vào int trên 32 bit hoặc dài trên 64 bit.Vì NSDictionary chỉ có thể lưu trữ các đối tượng, bạn cần bọc số nguyên vào một đối tượng trước khi bạn có thể lưu trữ nó.

Vì vậy, trong trường hợp Swift, đây là cách bạn làm điều đó:

let temp:NSInteger = yourInteger.hashValue 
Các vấn đề liên quan