Передайте NSDictionary, чтобы он мог выполнять изменения, но обнаружил то же самое в главной функции

В моем основном методе я объявляю и передаю свой NSDictionary в функцию в отдельном классе под названием Thing.

главный():

    NSMutableDictionary *myDictionary;
    Thing *foo = [Thing thingWithName:@"Frankenstein"];
    [foo addThing:foo withKey:@"foo" inDictionary:myDictionary];

функция в классе Thing:

-(BOOL) addThing:(Thing*)thing withKey:(NSString*)key inDictionary:(NSMutableDictionary*) myDictionary {

   if(!myDictionary) {
   myDictionary = [NSMutableDictionary dictionary];
   [myDictionary setObject:thing forKey:key];
   return YES; 
   }
   return NO;
}

Однако, когда я проверяю свой основной метод для myDictionary size, он отображается как пустой:

 if([myDictionary count] > 0) {
     NSLog(@"I'm not empty!");
}
else {
    NSLog(@"Dictionary is empty");
}

//Prints out "Dictionary is empty"

Я попытался изменить свои параметры на (NSMutableDictionary **) и * login для вызова по ссылке вместо значения в моем методе addThing, но мой основной метод жалуется, когда я это делаю:

[foo addThing:foo withKey:@"foo" inDictionary:*myDictionary];

"Sending'NSMutableDictionary" к параметру несовместимого типа "NSMutableDictionary * _autoreleasing *"

Я полностью потерял то, что нужно делать, и буду благодарен за вашу помощь.

-3
источник поделиться
4 ответа

чтобы быть ясным: [foo addThing:foo withKey:@"foo" inDictionary:*myDictionary]; неверно, так как ваш метод ожидает регулярный указатель, но вы передаете указатель на указатель, поскольку объект Objective-C действительно обращается через указатель (объекты могут жить только в куче). Это то, о чем говорит ваша ошибка. Также вы должны игнорировать предупреждения.

Либо измените свой метод на

-(BOOL) addThing:(Thing*)thing withKey:(NSString*)key inDictionary:(NSMutableDictionary **) myDictionary {

или называть его похожим

[foo addThing:foo withKey:@"foo" inDictionary:myDictionary];

Фактически с изменчивыми битами я бы пошел со вторым вариантом, но чем больше я думаю, было бы лучше использовать непреложные словари. Чем вы действительно должны использовать вариант один.

если вы соглашаетесь с pass-by-referenc, вы должны называть его так:

[foo addThing:foo withKey:@"foo" inDictionary:&myDictionary];

и не

[foo addThing:foo withKey:@"foo" inDictionary:*myDictionary];
0
источник

Вы инициализировали словарь?

+1
источник

Думаю, я понимаю вашу проблему: когда вы звоните

-(BOOL) addThing:(Thing*)thing withKey:(NSString*)key inDictionary:(NSMutableDictionary*) myDictionary {

с входным параметром myDictionary, этот параметр сначала копируется в локальную переменную с тем же именем. Когда вы затем инициализируете его внутри этого метода, будет инициализирована только локальная переменная, а не переменная, которую вы ввели в метод! Таким образом, вы не можете инициализировать свою переменную, определенную в main.
Вам пришлось изменить свой метод на что-то вроде

-(NSMutableDictionary*) addThing:(Thing*)thing withKey:(NSString*)key inDictionary:(NSMutableDictionary*) myDictionary {
...
    return myDictionary;
}

после того, как myDictionary был инициализирован в вашем методе.

0
источник

Ваша проблема в том, что вы только инициализируете локальную переменную dict в addThing:withKey:inDictionary. Чтобы иметь возможность влиять на NSDictionary, вы передаете как аргумент, вы действительно должны передать NSDictionary ** в свою функцию. Что-то, что действительно работает, было бы

- (BOOL) addThing:(id)thing withKey:(NSString *)key inDictionary:(NSMutableDictionary **)dict{
   if(!*dict && key && thing){
      *dict = [NSMutableDictionary dictionary];
      [*dict setObject:thing forKey:key];
      return YES;
   }
   return NO;
}

и назовите его так:

NSMutableDictionary *dict;
[foo addThing:foo withKey:@"key" inDictionary:&dict]

Это действительно превратит dict в словарь non-nil, если вы не передали ник- key или thing, которая будет содержать объект foo для ключа @"key".

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос