1

私はBigNerdRanchのObjective-Cのガイドに従っていますが、課題の1つ(第17章)で、彼はあなたが作成したオブジェクトの3つのインスタンスを作成するように求めています。私はクラスを作成し、セッターを実装しました。 、getterと2つのインスタンスメソッドを使用して、オブジェクトの3つのインスタンスを作成し、すべての変数を定義しました。次に、3つのオブジェクトを配列に入れ、forループで値を反復するように求められます。

私が抱えている問題は、「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;
}
4

2 に答える 2

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は、新しいコンパイラでは必要ありません。を使用する場合は、1行に1つのプロパティを使用してみてください。

  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 *stocksList=@[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);
}
于 2013-01-23T16:57:58.323 に答える
1

NSLOGでstockObjの名前を印刷する方法も知っていますか?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の最新バージョンでは、iVarを宣言する必要はありません。どちらも合成する必要はありません。

@interface StockHolding : NSObject

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


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

@end

合成しない場合、ivars名は-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];
}
于 2013-01-24T12:00:17.320 に答える