2017-02-16 16 views
0

사전에 객체를 추가하는 방법뿐만 아니라 NSMutableDictionary을 만들었습니다. addObject 함수가 제대로 사전에 객체를 추가하지만 나중에 Print_Object 메서드를 사용하여 객체를 인쇄하려고하면 객체에 속한 모든 단일 변수가 null/0으로 인쇄됩니다. 내 코드에 문제가 있습니까?NSMutableDictionary 개체가 메서드에서 제대로 액세스되지 않습니까?

#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 
+1

제 생각에는 문제는'[self.stock setValue : obj forKey : theKey];'에 있습니다. 당신의 obj가 Object이기 때문에'setValue' 대신'setObject'를 사용하려고 할 수 있습니까? Like '[self.stock setObject : obj forKey : theKey]; ' – nynohu

+0

@nynohu가 작동하지 않습니다. 그것은 여전히 ​​나에게 같은 결과를 준다. 나는 현재 나의 주요 함수에서'[newDict Print_Object : @ "Galaxy Note7"]; (내 메소드를 포함하는 클래스의 인스턴스 사용)를 호출 중이며, 출력은 다음과 같다. ** Key : Galaxy Note7 Description : null) Retail Cost : 0.000000 Wholesale Cost : 0.000000 Hand on 수 : 0 Number Sold : 0 ** – user6335453

+0

사전에 값을 설정하기 전에 객체 추가 기능에 obj를 인쇄 할 수 있습니까 –

답변

0

당신이 우리에게 stock의 선언을 보여줄 수

-(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의 선언은? @property으로 선언 한 것으로 의심됩니다.이 경우 -_stock을 getter로 선언하려는 시도는 효과가 없습니다. 인스턴스 변수는 _stock이지만 getter는 -stock입니다. 이것이 올바른 추측이면 NSLog(@"%@", self.stock)에 출력으로 (null)이 표시되어야합니다. 사용자 정의 게터가 호출되지 않으므로 사전이 생성되지 않습니다.

코드는 일반적으로 매우 오래된 것 같습니다.

  1. 이제는 @interface 내부에 인스턴스 저장소를 거의 두지 않습니다. @implementation에 넣으십시오.
  2. 전체 object_info@property으로 재구성 될 수 있으며 그 다음에 @implementation 내부에있는 것을 구현할 필요가 없습니다. 속성을 자동 합성하도록 허용하십시오.
  3. 이 아닌 [obj setDescription: desc]; 등으로 변경하면 obj.description = desc;과 같이 도트 구문을 더 일반적으로 사용하게됩니다. 컴파일러는 적절한 setter (또는 getter)가 호출되도록 보장합니다. 이것은 왼쪽에서 오른쪽으로 직접 읽는 것을 허용하면서 정신적 맥락이 덜 필요한 형식 일뿐입니다.
  4. 사전에 액세스하는보다 현대적인 방법은 액세스하려면 이고 액세스하려면 dictionary[key]입니다.
+0

주식의 선언은 내 프로그램의 주요 메소드에 있습니다. NSMutableDictionary * stockx = [NSMutableDictionary dictionaryWithDictionary : @ { }]; '저는 현재 iOS 프로그래밍의 초보자입니다. 내 코드가 오히려 고풍스러운 이유 인 기본 사항을 이해합니다. – user6335453

+0

솔직히 말하면 너무 잘못 보입니다. 나는 그것이 작동한다고 생각하지만 ... 그냥 @ {}을 직접 주거나 new를 사용한다 ... dictionaryWithDictionary는 불필요하다. – ghostatron

+0

당신은'self.stock'을 사용합니다; '주식 '을 어디에 선포 할 수 있습니까? 귀하가 제공 한 코드에는 그러한 속성이나 가져 오기 도구가 표시되지 않습니다. – Tommy

0
[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"]; 

개체가 nil이므로 잘못되었습니다.

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