Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-CIF else函数,需要从数组迭代,但Xcode抛出了未声明的错误_Objective C_Xcode_Loops_If Statement_Nsmutablearray - Fatal编程技术网

Objective-CIF else函数,需要从数组迭代,但Xcode抛出了未声明的错误

Objective-CIF else函数,需要从数组迭代,但Xcode抛出了未声明的错误,objective-c,xcode,loops,if-statement,nsmutablearray,Objective C,Xcode,Loops,If Statement,Nsmutablearray,该代码应该是一个基本的objc程序,其中包含一个已购买股票的列表,包括国内外股票。现在,我必须把它们放入一个投资组合中,并对其进行总结。我意识到我不能总结它们,因为我的BNRForeign头文件和实现文件出错。关于代码的其余部分,请参见此处(我回答的另一个问题): 因此,我正在为我正在阅读的一本书中的股票问题编写一些代码,我昨天发布的另一个问题部分回答了这个问题。我现在有一个全新的问题 对于if条件,我希望遍历数组,但不确定如何实现 我的main.m: int main(int argc, co

该代码应该是一个基本的objc程序,其中包含一个已购买股票的列表,包括国内外股票。现在,我必须把它们放入一个投资组合中,并对其进行总结。我意识到我不能总结它们,因为我的BNRForeign头文件和实现文件出错。关于代码的其余部分,请参见此处(我回答的另一个问题):

因此,我正在为我正在阅读的一本书中的股票问题编写一些代码,我昨天发布的另一个问题部分回答了这个问题。我现在有一个全新的问题

对于if条件,我希望遍历数组,但不确定如何实现

我的main.m

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;

        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;
            float d = s.costInDollars;
            float e = s.valueInDollars;
            float f = s.foreignCostInDollars;
            float g = s.foreignValueInDollars;

            if () {
                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 {
                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, f, g);
            }

            }
    }
    return 0;
}
基本上,对于stock0、stock1和stock2,我需要NSLog来应用函数a、b、c、d、e。对于stock3,我需要NSLog来应用函数a、b、c、f、g

我试过这样的方法:

if (stock(i), i=0, i<=2) {

NSLog(@"etc", a, b, c, d, e);
}
else {
NSLog(@"etc", a, b, c, f, g);
}

if(stock(i),i=0,i您的for必须如下所示:

    for (BNRStockHolding * s in stocks) {
      //Common assingments
      if([s isKindOfClass:[BNRForeignStockHolding class]]){
          BNRForeignStockHolding * aux = (BNRForeignStockHolding*)s;
          float f = aux.foreignCostInDollars;
          float g = aux.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 if([s isKindOfClass:[BNRStockHolding class]]){
          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, f, g);
      }
   }

概括而言,你的问题不是“为
stock3
做点什么”,而是“根据股票是否是
BNRForeignStockHolding
的实例做点什么”

当您有一个类的实例时,您可以使用方法
isMemberOfClass:
(注意:有一个相关的方法
isKindOfClass:
,它测试类是否是一个类或其任何子类)

因此,您可以使用以下方法测试
s
是否是
BNRForeignStockHolding
的实例:

[s isMemberOf:[BNRForeignStockHolding class]]
使用此选项,您可以重写代码,只使用两个变量,
d
e
,根据
s
的类型设置它们:

float d, e;
if ([s isMemberOf:[BNRForeignStockHolding class]])
{
   // BNRForeignStockHolding
   d = s.foreignCostInDollars;
   e = s.foreignValueInDollars;
}
else
{
   // BNRStockHolding
   d = s.costInDollars;
   e = s.valueInDollars;
}
现在,您可以使用变量
a
b
c
d
e
,而不管您的股票中有哪些是外来的,代码都会起作用


HTH

Thx,我会试试。我不熟悉objective-c和Xcode,它有自己的怪癖。好吧,它部分像我的其他尝试一样工作……尽管有一个问题:Xcode成功构建,但它会抛出一些运行时错误,例如“内存地址未捕获异常”和NSException。”我正在浏览Xcode文档中的函数,但是我很难找到一个可以很好地工作的东西。我不会像这样编写程序,但这本书对此提出了挑战,我想知道设置是否很差,因为在这一点上,似乎最好的选择是将BNRForeign和BNRStock合并为一个,remove if/else,只需分离NSLog打印输出。好的,现在,我在float f=foreignCostInDollars上得到一个运行时错误;这表示线程1 SIGABRT。您“for”中有一个问题你说每个类都是BNRForeignStockHolding,但大多数都是BNRStockHolding。我想这可能是个问题,但我不确定如何将所有股票包含到一个数组中,因为它们来自不同的类。我知道这听起来像是一个愚蠢的问题,但我对objective-c不太熟悉,它的语法有时让我感到困惑。我想是的因为我的BNRForeign实现文件是BNRStock头的一个子类,调用BNRForeign也会调用BNRStock函数,因为BNRForeign股票只是带有额外计算(转换率)的股票,但在其他方面处理方式相同。代码运行良好,但有没有更好的方法来编写此数组?我没有这个-应用函数?什么是stock(I)如果应该是什么…将objC代码和xcodeLink的屏幕截图添加到OP中添加的完整代码中。非常感谢,这解决了我的问题!这正是我想要做的,但不知道如何做。我真的不知道我可以定义e,d两次,但没有冲突。现在我知道我可以分开定义if/else函数中的变量。感谢您的详细解释和示例。代码很干净,一点也不冗长。很抱歉,有一个输入错误,已修复。您只声明变量
d
e
一次,但根据条件测试为它们分配不同的值。没问题,我在测试时发现了输入错误修改代码…xcode崩溃了,我再次意识到发生了什么,哈哈。Thx。如果你有时间,你能看看我关于同一代码的另一个问题吗,我对xcode和我的头文件,Thx又很难理解。即使我导入了另一个头文件,它也不会接受一个头文件作为另一个头文件的子类: