iOS: for循环更新NSMutableArray的对象

iOS: update object of NSMutableArray in for loop

我需要在 NSMutableArray 中更新/添加键 -> 值对。

如果尚未设置密钥,我想添加一个具有固定值的密钥。

我尝试了以下 - 但应用程序在 addObject 崩溃并出现 "mutating method sent to immutable object" 错误:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:@"bookmarks"];

    for (id bookmark in bookmarks) {

        if ([bookmark objectForKey:@"type"] == NULL){
            [bookmark addObject:@"old" forKey:@"type"];
        }
    }

    [[NSUserDefaults standardUserDefaults] synchronize];

试试这个:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//SAVING

NSMutableArray *bookmarksSaving = [NSMutableArray new];

[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:@[@"red"] forKeys:@[@"color"]]];
[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:@[@"yellow"] forKeys:@[@"color"]]];
[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:@[@"green",@"new"] forKeys:@[@"color",@"type"]]];

[defaults setObject:bookmarksSaving forKey:@"bookmarks"];
[[NSUserDefaults standardUserDefaults] synchronize];

//MODIFY

NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:@"bookmarks"];

NSUInteger index = 0;
for (NSDictionary *bookmark in bookmarks) {

    NSMutableDictionary *bookmarkMutable = [bookmark mutableCopy];

    if ([bookmarkMutable objectForKey:@"type"] == nil)
    {
        [bookmarkMutable setValue:@"old" forKey:@"type"];
        [bookmarks replaceObjectAtIndex:index withObject:bookmarkMutable];
    }

    index++;
}

[[NSUserDefaults standardUserDefaults] synchronize];

您必须将书签保存为 NSMutableDictionary 才能 add/remove keys/value

  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  NSArray *bookmarks = [defaults objectForKey:@"bookmarks"];
  NSMutableArray *newBookMarks = [bookmarks mutableCopy];
  for (NSDictionary *bookmark in bookmarks) {
    NSMutableDictionary *newBookmark = [bookmark mutableCopy];
    if (![bookmark objectForKey:@"type"]){
      [newBookmark setObject:@"old" forKey:@"type"];
    }
    [newBookMarks addObject:newBookmark];
  }
  [defaults setObject:newBookMarks forKey:@"bookmarks"];
  [defaults synchronize];

您的外部数组包含不可变字典。一种选择如下:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:@"bookmarks"];

[booksmarks enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSDictionary *bookmark, NSUInteger index, BOOL *stop) {
    if (!bookmark[@"type"]) {
        NSMutableDictionary *mutable = [bookmark mutableCopy];
        mutable[@"type"] = @"old";
        [bookmarks replaceObjectAtIndex:index withObject:[mutable copy]];
    }
}];

// Update NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"bookmarks"];

这应该很高效,因为它可以同时更新多个词典。