2012-02-12 31 views
8

Tôi đang cố truy cập đối tượng từ điển của mình. Đây là mã của tôi:Sử dụng int làm khóa NSDictionary?

int tag = object.tag; 
CGPoint point = [[self.dict objectForKey:tag] CGPointValue]; 

Vấn đề là objectForKey được yêu cầu lấy đối tượng Mục tiêu-C chứ không phải int. Tôi đã thử gói thẻ vào một NSNumber với [NSNumber numberWithInt:tag] và chuyển nó vào objectForKey: nhưng nó trả về một đối tượng null.

Bất kỳ ý tưởng nào? Cảm ơn

+3

Làm thế nào mà bạn đặt các đối tượng vào 'self.dict' trong nơi đầu tiên? – mattjgalloway

+0

initWithObjectsAndKeys: [Giá trị NSValueWithCGPoint: CGPointMake (1,2)], @ "100", v.v. Lưu ý rằng từ điển của tôi là tốt, tôi đang truy cập nó trong các phần khác của mã của tôi với một for-in (cho khóa id trong self.dict) vòng lặp. Tuy nhiên trong trường hợp này tôi không muốn sử dụng một vòng lặp. Cảm ơn – user339946

Trả lời

13

Nếu bạn đang sử dụng số làm chuỗi cho khóa từ điển, bạn nên biến số int thành NSString hoặc NSNumber để sử dụng làm khóa từ điển. Dưới đây là làm thế nào để làm điều đó cho một chuỗi:

NSString *key = [NSString stringWithFormat:@"%d", myInteger]; 

Như @Hughes BR đề cập trong một bình luận, yêu cầu cho đối tượng quan trọng là nó phải phù hợp với giao thức NSCopying.

+0

Xin chào, tôi đã tự đặt object.tag thành 100, 101, v.v. Các phím từ điển được viết là @ "101". Lưu ý rằng tôi đã truy cập từ điển thành công trong các phần khác của mã của tôi, đặc biệt khi tôi sử dụng vòng lặp for-in. Các đối tượng và khóa từ điển của tôi đều ở đó. – user339946

+15

Bạn không cần sử dụng chuỗi. Một 'NSNumber' sẽ đủ và có khả năng là một sự phù hợp tự nhiên hơn. '[NSNumber numberWithInteger: [object tag]]' sẽ thực hiện thủ thuật. –

+0

@SedateAlien Đúng vậy; nếu tất cả các khóa là ints, thì NSNumber là tốt hơn bởi vì nó là một kiểu dữ liệu cụ thể hơn. Sau đó, bất kỳ nỗ lực nào để tạo một NSNumber từ loại dữ liệu sai sẽ giúp dễ dàng xác định vấn đề. – bneely

5

Tôi sử dụng NSNumbers mà không gặp sự cố, nhưng phải tránh các phương pháp thông thường setObject: forKey: hoặc setValue: forKey:. Điều đó sẽ tạo ra một cảnh báo.

Không báo trước, tuy nhiên, được tạo ra (và các mã hoạt động như dự kiến) với

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSNumber *key = @1; 
id *myObject = [your code here]; 
myDict[key] = myObject; 

Retrieval là đơn giản:

myObject = myDict[key]; 
Các vấn đề liên quan