试图创建一个总价值为Objective-C的股票投资组合,但不确定方法

试图创建一个总价值为Objective-C的股票投资组合,但不确定方法,objective-c,macos,methods,instance-variables,xcode6.1.1,Objective C,Macos,Methods,Instance Variables,Xcode6.1.1,我目前正在用《大书呆子牧场指南》第二版自学Objective-C,直到第21章我才遇到问题。我查看了这本书的论坛,但没有任何帮助,因为那里的大多数人都是使用意大利面代码的新手,我不想养成坏习惯……我也是一个初学者,因为这是我的第一门主要语言,但当你看到意大利面代码时,它是显而易见的 我必须使用上一章中的代码,制作一个工具,创建一个BNRPortfolio类的实例,并将其填充为股票持有量,同时还必须汇总投资组合的当前价值。然后我必须向BNRStockHolding添加一个symbol属性,该属性将

我目前正在用《大书呆子牧场指南》第二版自学Objective-C,直到第21章我才遇到问题。我查看了这本书的论坛,但没有任何帮助,因为那里的大多数人都是使用意大利面代码的新手,我不想养成坏习惯……我也是一个初学者,因为这是我的第一门主要语言,但当你看到意大利面代码时,它是显而易见的

我必须使用上一章中的代码,制作一个工具,创建一个BNRPortfolio类的实例,并将其填充为股票持有量,同时还必须汇总投资组合的当前价值。然后我必须向BNRStockHolding添加一个symbol属性,该属性将股票代码作为NSString保存

我只是完全搞不清楚在哪里添加代码来完成这项工作,以及如何开始。根据我在网上的研究,这一章写得很糟糕,也是大多数读者陷入困境的地方……作者们甚至同意,在未来的版本中,如果有任何时候因为快速进入,他们会重写整个章节

目前,我上一章的代码如下所示:

-(float)currentTotalValue
{
return _currentTotalValue = _currentSharePrice * _numberOfShares;
}
// in BNRPortfolio.h

@class BNRStockHolding;

@interface BNRPortfolio : NSObject

- (void)addHolding:(BNRStockHolding *)holding;
- (float)portfolioValue;

@end

// in BNRPortfolio.m

#import "BNRPortfolio.h"
#import "BNRStockHolding.h"

@interface BNRPortfolio ()  // fixed typo here
@property (strong, nonatomic) NSMutableArray holdings;
@end

@implementation BNRPortfolio

- (id)init {
    self = [super init];
    if (self) {
        _holdings = [NSMutableArray array];
    }
    return self;
}

- (void)addHolding:(BNRStockHolding *)holding {
    [self.holdings addObject:holding];
}

- (float)portfolioValue {
    float sum = 0;
    for (BNRStockHolding *holding in self.holdings) {
        sum += [holding valueInDollars];
    }
    return sum;
}

@end
BNRStockHolding.h

接下来,我必须添加转换率将价值和成本转换为美元的外国股票:

BNRForeignStockHolding.h

我的主文件: main.m

在BNRStockHolding.m中,我实现了如下:

-(float)currentTotalValue
{
return _currentTotalValue = _currentSharePrice * _numberOfShares;
}
// in BNRPortfolio.h

@class BNRStockHolding;

@interface BNRPortfolio : NSObject

- (void)addHolding:(BNRStockHolding *)holding;
- (float)portfolioValue;

@end

// in BNRPortfolio.m

#import "BNRPortfolio.h"
#import "BNRStockHolding.h"

@interface BNRPortfolio ()  // fixed typo here
@property (strong, nonatomic) NSMutableArray holdings;
@end

@implementation BNRPortfolio

- (id)init {
    self = [super init];
    if (self) {
        _holdings = [NSMutableArray array];
    }
    return self;
}

- (void)addHolding:(BNRStockHolding *)holding {
    [self.holdings addObject:holding];
}

- (float)portfolioValue {
    float sum = 0;
    for (BNRStockHolding *holding in self.holdings) {
        sum += [holding valueInDollars];
    }
    return sum;
}

@end
然后在main.m中,我将其添加到我的stocks数组中的'for'函数中:

float f = s.currentTotalValue;
然后将%.2f@,f添加到我的NSLog打印输出中

除了以下警告外,它工作得非常好:

它只是给了我每个股票的价值,而没有转换外国股票。我有点理解为什么,但这一章没有彻底解释如何解决这样一个问题,所以我完全不知所措。我甚至无法尝试添加股票代码,因为我不确定在哪里实现它

当手工计算我的投资组合的总价值时,包括折算的国外价值,总价值应为17774.895美元。请记住,这些股票是虚假的,转换率也是如此

谢谢你的帮助,非常感谢

编辑以添加

问题解决了,我必须重写我的BNRStock和BNRForeign.h和.m文件,覆盖costInDollars和valueInDollars,并为NSLog添加一个例外,以便通过[NSString stringWithFormat:]方法分别打印每个文件的结果。然后我添加了推荐的求和代码,做了一些调整,一切都很好。我还在.h和.m文件中将symbol定义为指针,然后将它们包含在[NSString stringWithFormat:]打印输出命令中,从而毫无问题地添加了股票代码


感谢danH注意到我的costInDollars和valueInDollars应该被覆盖以同时为BNRStock和BNRForeign类工作,因为这是我的程序的主要问题

不熟悉这本书,但听起来bnportfolio是一个新类,应该有一个新的.h和.m文件。你应该从你迄今为止所做的工作中借鉴命名惯例。一个开始应该是这样的:

-(float)currentTotalValue
{
return _currentTotalValue = _currentSharePrice * _numberOfShares;
}
// in BNRPortfolio.h

@class BNRStockHolding;

@interface BNRPortfolio : NSObject

- (void)addHolding:(BNRStockHolding *)holding;
- (float)portfolioValue;

@end

// in BNRPortfolio.m

#import "BNRPortfolio.h"
#import "BNRStockHolding.h"

@interface BNRPortfolio ()  // fixed typo here
@property (strong, nonatomic) NSMutableArray holdings;
@end

@implementation BNRPortfolio

- (id)init {
    self = [super init];
    if (self) {
        _holdings = [NSMutableArray array];
    }
    return self;
}

- (void)addHolding:(BNRStockHolding *)holding {
    [self.holdings addObject:holding];
}

- (float)portfolioValue {
    float sum = 0;
    for (BNRStockHolding *holding in self.holdings) {
        sum += [holding valueInDollars];
    }
    return sum;
}

@end
您应该能够先分配其中一个,然后添加多个国外和国内持股,然后询问投资组合的价值

编辑-通过以下方式从main调用它:

#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
#import "BNRForeignStockHolding.h"
#import "BNRPortfolio.h"

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

    // build stock0, stock1, stock2, stock3 just as you have them, then...

    BNRPortfolio *portfolio = [[BNRPortfolio alloc] init];

    [portfolio addHolding:stock0];
    [portfolio addHolding:stock1];
    [portfolio addHolding:stock2];
    [portfolio addHolding:stock3];

    NSLog(@"The total value of the portfolio in USD is %f", [portfolio portfolioValue]);
    }
return 0;

}

我可能很傻,但我看不出您的代码中包含了整个投资组合价值的总和。我知道每个股票的总价值是在哪里计算的。也许您需要在for循环之外:

float f = 0.0;
f += e;
然后在for循环中:

float f = 0.0;
f += e;
这里还有一些关于不同方法的想法

我想我不会在main.m中输入任何代码。我认为:

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[])
{
    return NSApplicationMain(argc, argv);
}
然后在另一个类中,假设.h文件中的bnportfolio,我可能有:

#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
#import "BNRPortfolio.h"
#import "BNRForeignStockHolding.h

@interface AppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate>

{
    @public

    BNRStockHolding *bnrStockHolding;
    BNRPortfolio *bnrPortfolio;
    BNRForeignStockHolding *bnrForeignStockHolding; 
}
@class AppDelegate;

@interface BNRPortfolio : NSObject

{

    @public

    NSMutableArray *holdings;

    @private

    AppDelegate *appDelegate;
}

- (void)addHolding:(BNRStockHolding *)holding;
- (float)portfolioValue;
在bnportfolio.m文件中:

#import "BNRPortfolio.h"
#import "AppDelegate.h"

@implementation BNRPortfolio

- (id)init 
{
    self = [super init];
    if (self) 
    {
        holdings = [[NSMutableArray alloc]init];
        appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];
    }
    return self;
}
如果在其他类中设置了变量和AppDelegate指针,那么在这些类中,例如,可以访问portfolioValue方法,如下所示:

float portValue = [appDelegate->brnPortfolio portfolioValue];
[appDelegate->brnPortfolio->holdings addObject:holding];
可通过以下方式访问控股:

float portValue = [appDelegate->brnPortfolio portfolioValue];
[appDelegate->brnPortfolio->holdings addObject:holding];
这显然只是应用程序的一个框架,但已经太长了,但我希望您能理解。在编程中,总是有很多方法来完成事情,有时一种方法比另一种更好,这取决于环境。我只是碰巧很少使用main.m

最后一条评论是,我们在class.h文件中使用@class AppDelegate,在.m文件中使用import AppDelegate.h的原因是,否则将设置循环引用,编译器将不允许这样做

这就是AppDelegate.h正在导入bnPortFolio.h,bnPortFolio.h将导入AppDelegate.h。那是循环引用


因此,我们使用@class语句告诉编译器暂时不要担心,稍后我们将定义该类,然后在class.m文件中导入AppDelegate.h

谢谢大家!!我很快就会试试这个,然后再给你回复。我想我可以
必须创建一个新类,但不确定。再次感谢,我很感激!我在上面添加了另一个相关问题,仍然使用您提供的示例。我认为我的头文件和实现文件中有一些奇怪的错误,但我不确定是什么。我认为你不应该在头文件中添加任何东西。您遇到的问题是调用代码。它不应该试图打电话给外国人。没有这样的事。练习的重点是,国外和国内股票对您的作用是相同的,即告诉您它们的美元价值,即使使用更复杂的等式,子类也会为您隐藏这些。请注意我建议的代码如何仅调用valueOnDollars,并在代码中仅提及超类。我们希望它不知道股票的种类。我认为您的主代码也应该这样做,而不需要向isMemberOfClass.Thx寻求建议。我使用isMemberofClass,因为我必须对股票使用两个单独的计算,然后将它们相加。我担心,如果我只使用你的主文件,我会丢失单独的计算结果。Thx的建议,我正在研究它。我意识到,是的,我在引用所有东西。我将导入保存在头文件BNRPort to BNRForeign to BNRStock中,但我将@class BNRPortfolio添加到BNRStockHoldings.h中,以便它知道子类。这解决了我的头文件和实现文件错误。我还从BNRForeignStockHoldings.h中删除了两个@property行,这个错误也消失了。仍在确定总结投资组合的最佳方式,并添加股票代码,这是最容易的部分。