NSMutableDictionary объекты не правильно доступны из методов?
Я создал NSMutableDictionary
а также метод для добавления объектов в словарь. Я знаю, что функция addObject добавляет объекты в словарь правильно, но позже, когда я пытаюсь распечатать объекты с помощью метода Print_Object
каждая переменная, принадлежащая объекту, печатается как null/0
, Что-то не так с моим кодом?
-(NSMutableDictionary *)_stock{
if (!_stock) {
_stock = [[NSMutableDictionary alloc]init];
}
return _stock;
}
-(void) addObject:(NSString*) desc key: (NSString*) theKey floatrc: (float) retailcost floatwsc: (float) wholesalecost intnoh: (int) numonhand floatns: (int) numsold {
object_info* obj = [[object_info alloc]init];
[obj setDescription: desc];
[obj setRetailCost: retailcost];
[obj setWholeSaleCost:wholesalecost];
[obj setNumOnHand: numonhand];
[obj setNumItemsSold: numsold];
[self.stock setValue:obj forKey:theKey];
}
-(void) Print_Object:(NSString *) theKey {
object_info* obj = [self.stock objectForKey:theKey];
NSLog(@"Key: %@ Description: %@ Retail Cost: %f Wholesale Cost: %f Number on Hand: %i Number Sold: %i", theKey, obj.description, obj.retail_cost, obj.wholesale_cost, obj.num_on_hand, obj.num_items_sold);
}
Это объявление object_info:
#import "object_info.h"
@implementation object_info
//Getters
-(NSString *)description {
return description;
}
-(float) retail_cost {
return retail_cost;
}
-(float) wholesale_cost {
return wholesale_cost;
}
-(int) num_on_hand {
return num_on_hand;
}
-(int) num_items_sold {
return num_items_sold;
}
//Setters
-(void)setDescription:(NSString *) value {
description = value;
}
-(void) setRetailCost: (float) n {
retail_cost = n;
}
-(void) setWholeSaleCost: (float) n {
wholesale_cost = n;
}
-(void) setNumOnHand: (int) n {
num_on_hand = n;
}
-(void) setNumItemsSold: (int) n {
num_items_sold = n;
}
@end
Это object_info.h:
#import <Foundation/Foundation.h>
@interface object_info : NSObject
{
NSString *description;
float retail_cost;
float wholesale_cost;
int num_on_hand;
int num_items_sold;
}
-(NSString *)description;
-(void)setDescription:(NSString *)value;
-(float) retail_cost;
-(void) setRetailCost:(float) n;
-(float) wholesale_cost;
-(void) setWholeSaleCost:(float) n;
-(int) num_on_hand;
-(void) setNumOnHand: (int) n;
-(int) num_items_sold;
-(void) setNumItemsSold:(int) n;
@end
2 ответа
Можете ли вы показать нам декларацию stock
? Я подозреваю, что вы объявили это как @property
в этом случае ваша попытка объявить -_stock
поскольку добытчик будет неэффективным. Переменная экземпляра будет _stock
но получатель будет просто -stock
, Если это правильное предположение, то если бы вы NSLog(@"%@", self.stock)
Тебе следует увидеть (null)
в качестве вывода - ваш пользовательский геттер не вызывается, поэтому словарь никогда не создается.
Ваш код обычно выглядит очень старомодным; особенно:
- Вы почти никогда не помещаете хранилище экземпляров в
@interface
сейчас; положить его в@implementation
; - весь ваш
object_info
может быть переформулирован как@property
с, и тогда вам не нужно реализовывать вещь внутри этого@implementation
просто дайте свойствам автоматически синтезироваться; - скорее, чем
[obj setDescription: desc];
и т. д., теперь вы обычно видите использование синтаксиса точек, напримерobj.description = desc;
, Компилятор по-прежнему будет гарантировать, что вызывается правильный установщик (или получатель), это всего лишь формулировка, которая требует меньше ментального контекста, позволяя читать слева направо; - более нормальный современный способ доступа к словарю
dictionary[key] = value
хранить иdictionary[key]
для доступа.
[self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400];
[self Print_Object:@"BBB"];
Это прекрасно работает для меня, вы используете неправильный ключ?
[self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400];
[self Print_Object:@"AAA"];
Это идет не так, потому что объект равен нулю.
2017-02-16 10:48:34.086 Test[53298:14250944] Key: AAA Description: (null) Retail Cost: 0.000000 Wholesale Cost: 0.000000 Number on Hand: 0 Number Sold: 0