Cách thêm vào NSDictionary


91

Tôi đã sử dụng một NSMutableArray và nhận ra rằng sử dụng từ điển đơn giản hơn rất nhiều cho những gì tôi đang cố gắng đạt được.

Tôi muốn lưu một khóa dưới dạng một NSStringvà một giá trị inttrong từ điển. Làm thế nào là điều này được thực hiện? Thứ hai, sự khác biệt giữa từ điển có thể thay đổi và một từ điển bình thường là gì?

Câu trả lời:


197

Một có thể thay đổi từ điển có thể được thay đổi, tức là bạn có thể thêm và các đối tượng loại bỏ. Một bất biến được cố định sau khi nó được tạo.

tạo và thêm:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

và truy xuất:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

Bạn có phải bắt đầu với một công suất, hay nó có thể chỉ là động?
muttley91

2
Bạn không phải chỉ định dung lượng ban đầu, nhưng bạn có thể thấy hiệu suất tăng lên nếu bạn làm như vậy. Nếu bạn biết trước nó sẽ chứa bao nhiêu mục, hãy cung cấp số này hoặc giá trị lớn hơn một chút.
Eiko

yêu cầu NSDictionary không phải NSMutableDictionary?
Ananta Prasad

34

Bằng cách cài đặt, bạn sẽ sử dụng setValue:(id)value forKey:(id)keyphương thức NSMutableDictionaryđối tượng:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Hoặc trong Objective-C hiện đại:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

Sự khác biệt giữa có thể biến đổi và "bình thường" là khả năng biến đổi. Tức là bạn có thể thay đổi nội dung của NSMutableDictionary(và NSMutableArray) trong khi bạn không thể làm điều đó với "normal" NSDictionaryNSArray


2
Bạn không nên bọc số nguyên đó trong một Số NSN?
Johan Kool

Tôi có một vấn đề nữa với điều này. Tôi cần lưu trữ văn bản do người dùng nhập dưới dạng chuỗi cũng như tham chiếu hình ảnh (chỉ mục trong mảng hình ảnh) mà người dùng đang lưu văn bản vào. Tôi đã thử một mutableArray của các đối tượng có 2 biến, một cho mỗi biến mà tôi vừa đề cập. điều đó không hoạt động tốt khi cố gắng điền vào tableView với các giá trị văn bản của đối tượng mảng. VẬY, tôi đã nghĩ đến một từ điển, vấn đề duy nhất là nó trông giống như tôi có thể truy xuất dữ liệu bằng chỉ mục, nó phải là một khóa hoặc giá trị như một bản đồ băm phải không?
hệ thống

@Johan - chính xác và cập nhật! @alJaree - vâng, từ điển là kho khóa-giá trị của các loại. Tôi nghĩ ở vị trí của bạn, bạn sẽ tốt hơn với nhiều loại từ điển. Một cái gì đó giống như[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas

Điều này vẫn không hoạt động đối với tôi, vì tôi cần lấy văn bản từ từng đối tượng và sử dụng văn bản đó để điền vào UITableView yêu thích cũng như tôi cần tham chiếu chỉ mục đến mảng hình ảnh để tôi có thể truy xuất và hiển thị hình ảnh yêu thích đã chọn. Tôi đã thử đối tượng mà tôi đã mô tả ở trên, nhưng các đối tượng được trả về khi đọc từ mảng nơi NSStrings vì một số lý do thay vì đối tượng cụ thể đã được lưu trữ. Tôi không chắc phải làm gì ở đây,
system

Tôi đang nghĩ rằng tôi có thể chỉ cần lưu trữ các chuỗi NSString chẳng hạn như @ "% d _% @, index, saveTitle và sau đó chỉ cần tách NSString và lấy và thanh toán những gì tôi cần. Tôi đang nghĩ theo thuật ngữ java, chắc chắn phải có chức năng phân chia trong obj c. :)
system

16

Khi nào mảng được khai báo, thì chỉ chúng ta phải thêm khóa-giá trị trong NSDictionary như

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

chúng tôi không thể thêm hoặc xóa các giá trị chính trong NSDictionary này

Trong NSMutableDictionary, chúng ta có thể thêm các đối tượng sau khi intialization mảng cũng bằng cách sử dụng phương thức này

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

để xóa giá trị khóa, chúng tôi phải sử dụng mã sau

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

Bản nâng cấp

Objective-C

Tạo nên:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Thay đổi:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

Cú pháp viết tắt được gọi Objective-C Literals.

Nhanh

Tạo nên:

var dictionary = ["myKey1": 7, "myKey2": 5]

Thay đổi:

dictionary["myKey3"] = 3

1

Bạn muốn hỏi là "sự khác biệt giữa mảng hoặc từ điển có thể thay đổi và không thể thay đổi là gì." Nhiều khi có những thuật ngữ khác nhau được sử dụng để mô tả những thứ mà bạn đã biết. Trong trường hợp này, bạn có thể thay thế thuật ngữ "có thể thay đổi" bằng "động". Vì vậy, từ điển hoặc mảng có thể thay đổi là một từ điển hoặc mảng "động" và có thể thay đổi trong thời gian chạy, trong khi từ điển hoặc mảng không thể thay đổi là một từ điển hoặc mảng "tĩnh" và được xác định trong mã của bạn và không thay đổi trong thời gian chạy (nói cách khác , bạn sẽ không thêm, xóa hoặc có thể sắp xếp các phần tử.)

Về cách nó được thực hiện, bạn yêu cầu chúng tôi lặp lại tài liệu ở đây. Tất cả những gì bạn cần làm là tìm kiếm trong mã mẫu và tài liệu Xcode để xem chính xác cách thực hiện. Nhưng thứ có thể thay đổi cũng đã ném tôi khi tôi mới học, vì vậy tôi sẽ cho bạn cái đó!


Đôi khi không có lời giải thích đầy đủ về tài liệu Xcode, nó đi vào lý thuyết sâu mà không có ví dụ rõ ràng, không phải lúc nào, nhưng đôi khi. : P Vâng, tôi hiểu phần có thể biến đổi (có thể đột biến) bây giờ cảm ơn. :)
hệ thống

0

Để tham khảo, bạn cũng có thể sử dụng initWithDictionaryđể bắt đầu NSMutableDictionarybằng một chữ:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.