【问题标题】:Big Nerd Ranch Objective C Chapter 17 Challenge - Defining ClassesBig Nerd Ranch 目标 C 第 17 章挑战 - 定义类
【发布时间】:2012-08-27 21:10:51
【问题描述】:

我在处理课程时遇到问题。我必须创建作为 NSObject 子类的“StockHolding”对象。我创建实例变量和方法。然后我创建了 3 个包含名称和价格的库存迭代,并将它们加载到一个可变数组中。我很难快速枚举数组中的对象并打印每个对象的属性(价格)。问题是我在尝试枚举对象并打印属性时遇到错误。我尝试了几种不同的方法来解决这个问题,但没有运气。有任何想法吗?我还注意到 currentStock 不是打印名称,而是打印指针位置。也许这些问题是相关的。提前致谢。

'标题'

#import <Foundation/Foundation.h>

@interface StockHolding : NSObject
{
    float fPurchaseSharePrice; 
    float fCurrentSharePrice; 
    int iNumberOfShares;
}

@property float fPurchaseSharePrice;
@property float fCurrentSharePrice;
@property int iNumberOfShares;

-(float) fCostInDollars; //fPurchaseSharePrice * fNumberOfShares
-(float) fValueInDollars; //fCurrentSharePrice * fNumberOfShares

@end

'实施'

#import "StockHolding.h"

@implementation StockHolding

@synthesize fCurrentSharePrice, fPurchaseSharePrice, iNumberOfShares;

-(float)fCostInDollars; //fPurchaseSharePrice * iNumberOfShares
{    
    return (fPurchaseSharePrice * iNumberOfShares);
}

-(float)fValueInDollars; //fCurrentSharePrice * iNumberOfShares
{
    return (fCurrentSharePrice * iNumberOfShares);
}

@end

'主要'

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

@autoreleasepool {
    StockHolding *Apple = [[StockHolding alloc] init];
    [Apple setFPurchaseSharePrice:225];
    [Apple setFCurrentSharePrice:300];
    [Apple setINumberOfShares:50];

    StockHolding *Cisco = [[StockHolding alloc] init];
    [Cisco setFPurchaseSharePrice:100];
    [Cisco setFCurrentSharePrice:50];
    [Cisco setINumberOfShares:75];

    StockHolding *WalMart = [[StockHolding alloc] init];
    [WalMart setFPurchaseSharePrice:75];
    [WalMart setFCurrentSharePrice:150];
    [WalMart setINumberOfShares:75];

    NSMutableArray *Portfolio = [NSArray arrayWithObjects: Apple, Cisco, WalMart, nil];

    for (NSObject *currentStock in Portfolio){   
        NSLog(@"Purchase Price: %@", currentStock );
        NSLog(@"Details: %f", [currentStock FPurchaseSharePrice]);  //  <---Error is on this line.  It says "No visible @interface for NSObject declares the selector fPurchaseSharePrice"
    }

}
return 0;
}

【问题讨论】:

  • 大写字母很重要。如果您的对象属于正确的类类型,您将获得自动完成功能,而不是 for(NSObject * 尝试 for(StockHolding *。这实际上是子类化对象的重点是去公共超级而不是直接去 NSObject 这是每个类的超类
  • 查看给出的响应标记,因为它在答案中呈现了相同的场景。

标签: objective-c compiler-errors nsobject fast-enumeration


【解决方案1】:

改为为您的 for 循环执行此操作

for (StockHolding *currentStock in Portfolio){   
    NSLog(@"Purchase Price: %@", currentStock );
    NSLog(@"Details: %f", [currentStock fPurchaseSharePrice]);  //  <---Error is on this line.  It says "No visible @interface for NSObject declares the selector fPurchaseSharePrice"
}

【讨论】:

  • 我赞同这个回复。因为它在 for 循环中呈现了正确的对象超类,因此具有所有正确的方法和属性访问器。
【解决方案2】:

在您的 NSLog 中:FPurchaseSharePrice 应该是 fPurchaseSharePrice

此外,如果您覆盖 -(NSString *)description,打印该对象将生成该字符串,而不是您当前看到的该对象的指针。

- (NSString *)description
{
    return [NSString stringWithFormat:@"StockHolding: %.2f, %.2f", self.fCostInDollars, self.fValueInDollars];
}

产量:

Purchase Price: StockHolding: 11250.00, 15000.00

而不是:

Purchase Price: <StockHolding: 0x7fe438c0a480>

最后,您可以这样做:

for (StockHolding *currentStock in Portfolio)

并且可能没有响应的错误将消失。

【讨论】:

    【解决方案3】:

    好吧,就像它说的那样:你没有那个名字的方法。方法名称在 Objective-C 中区分大小写,并且您将属性(和相应的访问器)声明为 fPurchaseSharePrice。你想用这个:

    NSLog(@"Details: %f", [currentStock fPurchaseSharePrice]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多