我目前正在使用 Big Nerd Ranch 指南(第 2 版)自学 Objective-C,直到第 21 章我都没有遇到问题。我查看了这本书的论坛,但没有任何帮助,因为那里的大多数人都是新手意大利面条代码,我不想养成坏习惯......我也是初学者,因为这是我的第一个主要语言,但是意大利面条代码当你看到它时很明显。
我必须从前一章中获取我的代码,并制作一个工具来创建 BNRPortfolio 类的实例并用股票持有量填充它(还必须总结投资组合的当前价值)。然后我必须向 BNRStockHolding 添加一个符号属性,它将股票代码符号保存为 NSString。
我完全不知道在哪里添加代码来执行此操作以及如何开始。根据我的在线研究,这一章写得不好,是大多数读者陷入困境的地方……作者甚至同意在未来的版本中(如果曾经因为 Swift 加入)他们将重新编写整章。
目前,我上一章的代码如下所示:
BNStockHolding.h
#import <Foundation/Foundation.h>
@interface BNRStockHolding : NSObject
@property (nonatomic) float purchaseSharePrice;
@property (nonatomic) float currentSharePrice;
@property (nonatomic) int numberOfShares;
- (float)costInDollars;
- (float)valueInDollars;
@end
BNRStockholding.m
#import "BNRStockHolding.h"
@implementation BNRStockHolding
- (float)costInDollars
{
return _purchaseSharePrice * _numberOfShares;
}
- (float)valueInDollars
{
return _currentSharePrice * _numberOfShares;
}
@end
接下来,我必须添加具有将价值和成本转换为美元的转换率的外国股票:
BNRForeignStockHolding.h
#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
@interface BNRForeignStockHolding : BNRStockHolding
@property (nonatomic) float conversionRate;
@end
BNRForeignStockHolding.m
#import "BNRForeignStockHolding.h"
@implementation BNRForeignStockHolding : BNRStockHolding
- (float)costInDollars
{
float foreignCostInDollars = super.costInDollars;
return _foreignCostInDollars * _conversionRate;
}
- (float)valueInDollars
{
float foreignValueInDollars = super.valueInDollars;
return _foreignValueInDollars * _conversionRate;
}
@end
我的主文件: main.m
#import <Foundation/Foundation.h>
#import "BNRForeignStockHolding.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BNRStockHolding *stock0 = [[BNRStockHolding alloc]init];
BNRStockHolding *stock1 = [[BNRStockHolding alloc]init];
BNRStockHolding *stock2 = [[BNRStockHolding alloc]init];
BNRForeignStockHolding *stock3 = [[BNRForeignStockHolding alloc]init];
stock0.purchaseSharePrice=2.30;
stock0.currentSharePrice=4.50;
stock0.numberOfShares=40;
stock1.purchaseSharePrice=12.19;
stock1.currentSharePrice=10.56;
stock1.numberOfShares=90;
stock2.purchaseSharePrice=45.10;
stock2.currentSharePrice=49.51;
stock2.numberOfShares=210;
stock3.purchaseSharePrice=43.05;
stock3.currentSharePrice=28.31;
stock3.numberOfShares=15;
stock3.conversionRate=0.3;
NSMutableArray *stocks = [NSMutableArray arrayWithObjects:stock0, stock1, stock2, stock3, nil];
for (BNRForeignStockHolding *s in stocks) {
float a = s.purchaseSharePrice;
float b = s.currentSharePrice;
int c = s.numberOfShares;
if ([s isMemberOfClass:[BNRForeignStockHolding class]]) {
float d = s.foreignCostInDollars;
float e = s.foreignValueInDollars;
NSLog(@"\n Purchase Price: %.2f\n Current Price: %.2f\n Number of Shares %d\n Cost in Dollars %f\n Value in Dollars %f\n", a, b, c, d, e);
}
else {
float d = s.costInDollars;
float e = s.valueInDollars;
NSLog(@"\n Purchase Price: %.2f\n Current Price: %.2f\n Number of Shares %d\n Cost in Dollars %f\n Value in Dollars %f\n", a, b, c, d, e);
}
}
}
return 0;
}
我试过这个:
在 BNRStockHolding.h 中,我创建了一个实例变量:
- (float)currentTotalValue
在 BNRStockHolding.m 中,我是这样实现的:
-(float)currentTotalValue
{
return _currentTotalValue = _currentSharePrice * _numberOfShares;
}
然后在 main.m 中,我将其添加到我的股票数组中的“for”函数中:
float f = s.currentTotalValue;
然后将 %.2f@, f 添加到我的 NSLog 打印输出中。
除了这个警告之外,它工作得很好:
它只是给了我每只股票的价值,而没有转换外国股票。我有点明白为什么,但是这一章没有彻底解释如何解决这样的问题,所以我完全迷失了。我什至无法尝试添加股票代码,因为我不确定在哪里实现它。
将我的投资组合的总价值手动加起来,包括转换后的外国价值,总价值应该是 17,774.895 美元。请记住,这些股票是假装的,转换率等也是如此。
感谢您的帮助,非常感谢!
编辑添加
问题解决了,我不得不重写我的 BNRStock 和 BNRForeign .h 和 .m 文件,覆盖 costInDollars 和 valueInDollars,并为 NSLog 添加一个例外,以通过 [NSString stringWithFormat:] 方法为每个文件打印单独的结果。然后我添加了推荐的总和代码,并进行了一些调整,一切都运行良好。我还通过在我的 .h 和 .m 文件中将 symbol 定义为指针,然后将它们包含在 [NSString stringWithFormat:] 打印输出命令中,从而毫无问题地添加了股票代码。
感谢 danH 注意到我的 costInDollars 和 valueInDollars 应该被覆盖以适用于 BNRStock 和 BNRForeign 类,因为这是我的程序的主要问题。