2013-01-23 24 views
1

我正在遵循Big Nerd Ranch的Objective-C指南,在其中一項挑戰(第17章)中,他要求您創建3個實例一個你創建的對象,我創建了這個類,實現了setter,getters和兩個實例方法,然後我創建了3個對象實例並定義了所有的變量。然後他會要求你將3個對象放到一個數組中,並用for循環迭代這些值。在NSMutableArray的for循環中執行實例方法(包含3個對象)

我遇到的問題是我不知道如何在「for循環」中執行實例方法。

這是我迄今爲止(所有值是隨機的,假設):

StockHolding.h

#import <Foundation/Foundation.h> 

@interface StockHolding : NSObject 
{ 
    float purchaseSharePrice; 
    float currentSharePrice; 
    int numberOfShares; 
} 

@property float purchaseSharePrice; 
@property float currentSharePrice; 
@property int numberOfShares; 

- (float)costInDollars; 
- (float)valueInDollars; 

@end 

StockHolding.m

#import "StockHolding.h" 

@implementation StockHolding 

@synthesize purchaseSharePrice, currentSharePrice, numberOfShares; 

- (float)costInDollars; 
{ 
    return purchaseSharePrice * numberOfShares; 
} 
- (float)valueInDollars; 
{ 
    return currentSharePrice * numberOfShares; 
} 

@end 

的main.m

#import <Foundation/Foundation.h> 
#import "StockHolding.h" 


int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

    StockHolding *apple = [[StockHolding alloc] init]; 

     [apple setPurchaseSharePrice: 10]; 
     [apple setCurrentSharePrice: 50]; 
     [apple setNumberOfShares: 20]; 

    StockHolding *hmv = [[StockHolding alloc] init]; 

     [hmv setPurchaseSharePrice: 15]; 
     [hmv setCurrentSharePrice: 0]; 
     [hmv setNumberOfShares: 17]; 

    StockHolding *drpepper = [[StockHolding alloc] init]; 

     [drpepper setPurchaseSharePrice: 5]; 
     [drpepper setCurrentSharePrice: 15]; 
     [drpepper setNumberOfShares: 70]; 


     NSMutableArray *stocksList = [NSArray arrayWithObjects:apple, hmv, drpepper, nil]; 

     for (NSObject z in stocksList) { 

      NSLog(@"Original cost: %@", [z costInDollars]); 
      NSLog(@"Current value: %@", [z valueInDollars]); 

     } 

    } 
    return 0; 
} 
+0

*應該*只要你有喲你正確設置了變量'z'的類型。 –

+0

您可以使用'StockHolding *'來替代'NSObject' –

+0

@scott:您是否收到任何錯誤? –

回答

3

你的家庭工作很好。

沒有編譯就很難發現錯誤。

  • NSLog您使用%@爲[stockObj costInDollars]返回float,所以這裏是一個錯誤。使用%f

你只需要在你的代碼的一些潤色。

  1. 良好的命名約定。

  2. 的使用for(StockHolding *stockObj in stocksList)到位for (NSObject z in stocksList)

    for (StockHolding *stockObj in stocksList) { 
        NSLog(@"Original cost: %f", [stockObj costInDollars]);//%f as costInDollars returns float not an object 
        NSLog(@"Current value: %f", [stockObj valueInDollars]);//same as above 
    } 
    
  3. 的ivars可以跳過,@property將工作良好。

  4. @synthesize在新編譯器中不需要。如果您使用,請嘗試每行使用一個屬性。

  5. 相反的分配值:

    StockHolding *apple = [[StockHolding alloc] init]; 
    [apple setPurchaseSharePrice: 10]; 
    [apple setCurrentSharePrice: 50]; 
    [apple setNumberOfShares: 20]; 
    

    您可以使用:

    StockHolding *apple=[[StockHolding alloc]initWithPurchaseSharePrice:10 currentSharePrice:50 numberOfShares:20]; 
    

    爲此,您需要創建一個方法:

    -(StockHolding *)initWithPurchaseSharePrice:(float)purchase currentSharePrice:(float)current numberOfShares(int):numbers]; 
    
  6. 而不是NSMutableArray *stocksList = [NSArray arrayWithObjects:apple, hmv, drpepper, nil];你可以使用:

    NSMutableArray *[email protected][apple, hmv, drpepper]; 
    

編輯:

要打印stockObject:呼叫以下方法[self printStockObject:stockObject];

-(void)printStockObject:(StockHolding *)stockObj{ 
    NSLog(@"Purchase Price : %f",stockObj.purchaseSharePrice); 
    NSLog(@"Current Price : %f",stockObj.currentSharePrice); 
    NSLog(@"Number of Shares : %d",stockObj.numberOfShares); 
} 
+0

除了你原來的問題的答案,我還需要實現點#2,我以前曾嘗試%f,但它沒有工作,這就是爲什麼我將它改爲%@,將NSObject更改爲StockHolding的方法。太感謝了! - 你也知道我可以在NSLOG中打印stockObj的名字嗎?我試過NSLog(@「%@」,stockObj);但它只是返回內存地址。 –

+0

你不能直接打印對象,它會打印內存地址。你需要打印它的屬性值...檢查我的編輯答案。 –

+0

我在說打印對象的名稱,例如打印「我的Apple股票的原始成本:xxx」,「我的Apple股票的當前價值:xxx」。 –

1

你也會知道我可以打印stockObj中的NSLog的名字嗎?我試過NSLog(@「%@」,stockObj);但它只是返回內存地址。

覆蓋-description

-(NSString *)description { 
    return [NSString stringWithFormat:@"%@: purchase price: %f current price: %f, number of shares: %d", NSStringFromClass([self class]), self.purchaseSharePrice, self. currentSharePrice, self.numberOfShares]; 
} 

如果你也想在超類的description,做

[NSString stringWithFormat:@"%@: purchase price: %f current price: %f, number of shares: %d %@", NSStringFromClass([self class]), self.purchaseSharePrice, self. currentSharePrice, self.numberOfShares, [super description]]; 

AKV寫道,你應該循環是這樣的:

for (StockHolding *stockObj in stocksList) { 
    NSLog(@"%@",stockObj); 
} 

這是正確的。但是,如果你有其他的對象比在列表StockHolding,你也可以做

for (id stockObj in stocksList) { 
    NSLog(@"%@",stockObj); 
} 

,你可以發送任何消息id - 如果實現了,它會工作,否則崩潰。注意NSObject和id是不一樣的。


在現代版本的Xcode中,你不需要聲明iVars。你不需要綜合。

@interface StockHolding : NSObject 

@property float purchaseSharePrice; 
@property float currentSharePrice; 
@property int numberOfShares; 
@property (copy) NSString *shareName; 


- (float)costInDollars; 
- (float)valueInDollars; 

@end 

如果你不合成,實例變量名稱將是屬性的名稱與_ -prefix

shareName - >_shareName

StockHolding *apple = [[StockHolding alloc] init]; 
[apple setPurchaseSharePrice: 10]; 
[apple setCurrentSharePrice: 50]; 
[apple setNumberOfShares: 20]; 
[apple setShareName:@"apple"]; 

-description可能看起來像

-(NSString *)description { 
    return [NSString stringWithFormat:@"%@: %@ purchase price: %f current price: %f, number of shares: %d", NSStringFromClass([self class]),_shareName, self.purchaseSharePrice, self. currentSharePrice, self.numberOfShares]; 
} 
+0

我不確定什麼是iVars,我剛剛瞭解了Setter/Getters,看起來這就是iVars,如果我是對的,這是否意味着我的getter會是「shareName」,而我的setter將會是「_shareName」 - 我實際上已經得到了代碼的工作方式,我希望如何在AKV的幫助下工作,感謝您的幫助,我認爲我需要做的其餘工作就是編寫代碼更簡潔,考慮到我已經實現了我的目標,代碼的簡潔性對我來說並不重要,所以我將繼續前進,但我完全理解你的意思。再次感謝! –

+0

不,ivars是「實例變量」,getter/setter訪問它們,但是方法是[self setShareName:@「apple」]',屬性是生成這些getter/setter的方法,並允許訪問這個setter用點號('self.sharename = @「apple」;')。 – vikingosegundo

+0

但是如果這對你來說是新的,你現在應該檢查* Objective-C *編程。 – vikingosegundo