Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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 c 为什么我们可以在方法的实现中使用自定义/基础类的实例,而不首先对该实例执行alloc和init?_Objective C - Fatal编程技术网

Objective c 为什么我们可以在方法的实现中使用自定义/基础类的实例,而不首先对该实例执行alloc和init?

Objective c 为什么我们可以在方法的实现中使用自定义/基础类的实例,而不首先对该实例执行alloc和init?,objective-c,Objective C,这个问题基于斯坦福iOS系列2014(objective-c)第一堂课的代码 我们创建了一个名为Card的类,其中包括一个名为match:的方法,该方法将用于确定不同的卡牌在游戏中如何相互匹配,该方法将名为*otherCards的NSArray作为参数,在该方法的实现中,我们使用名为*Card的Card实例来迭代该数组 我的问题是-我们如何在不首先分配和实例化的情况下,声明我们的类卡实例,即*Card,并将其用作for循环中的迭代变量?同样,我们如何将*otherCards声明为NSArray的

这个问题基于斯坦福iOS系列2014(objective-c)第一堂课的代码

我们创建了一个名为
Card
的类,其中包括一个名为
match:
的方法,该方法将用于确定不同的卡牌在游戏中如何相互匹配,该方法将名为
*otherCards
NSArray
作为参数,在该方法的实现中,我们使用名为
*Card
Card
实例来迭代该数组

我的问题是-我们如何在不首先分配和实例化的情况下,声明我们的类卡实例,即
*Card
,并将其用作for循环中的迭代变量?同样,我们如何将*otherCards声明为NSArray的一个实例,然后在分配和初始化之前在for循环的循环中使用它

我意识到这可能会在代码后面完成,但为什么编译器不至少对此发出警告呢

代码如下:

//Card.h

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents; 
@property (nonatomic, getter=isChosen) BOOL chosen;
@property (nonatomic, getter=isMatched) BOOL matched;

- (int)match:(NSArray *)otherCards;



    //Card.m

  #import "Card.h"

    @implementation Card
    - (int)match:(NSArray *)otherCards
    {


        int score = 0; 
    for (Card *card in otherCards) { 
    if ([card.contents isEqualToString:self.contents ])
    {
            score = 1;
        }

        }

        return score;
    }


    @end
…(NSArray*)其他卡
Card*Card in
都是占位符

otherCards
是一个参数名。方法
match
需要一个(初始化的)NSArray作为参数来在方法中本地处理数组。关联的指针
(NSArray*)
保留对数组的引用,直到方法离开

Card*Card in
是一个临时索引指针,它在每次迭代中保存对数组中一个(初始化)项的引用

..(NSArray*)其他卡
Card*Card in
都是占位符

otherCards
是一个参数名。方法
match
需要一个(初始化的)NSArray作为参数来在方法中本地处理数组。关联的指针
(NSArray*)
保留对数组的引用,直到方法离开


Card*Card in
是一个临时索引指针,每次迭代时保存对数组中一个(初始化)项的引用

实例确实存在;这些只是您用于它们的本地名称。如果不先创建它们,就不会发生任何事情,这是对的,但创建它们不是此方法的工作

没有编译器警告,因为您在编译时没有做错任何事情:您获取了一个
NSArray
类型的对象并对其进行了迭代(使用
for(…in the array)
语法),其中每个成员都有一个临时名称。该数组在运行时可能不存在(可能是
nil
),但ObjC编译器无法知道这一点;即使发生了,结果也不会是什么,不是错误

稍后使用此方法的代码将如下所示:

Card * aCard = [[Card alloc] init];
// set aCard's properties
NSArray * cards = @[anotherCard, aThirdCard, stillAnotherCard];
[card match:cards];

创建所有这些对象,然后根据需要传递给方法。

实例确实存在;这些只是您用于它们的本地名称。如果不先创建它们,就不会发生任何事情,这是对的,但创建它们不是此方法的工作

没有编译器警告,因为您在编译时没有做错任何事情:您获取了一个
NSArray
类型的对象并对其进行了迭代(使用
for(…in the array)
语法),其中每个成员都有一个临时名称。该数组在运行时可能不存在(可能是
nil
),但ObjC编译器无法知道这一点;即使发生了,结果也不会是什么,不是错误

稍后使用此方法的代码将如下所示:

Card * aCard = [[Card alloc] init];
// set aCard's properties
NSArray * cards = @[anotherCard, aThirdCard, stillAnotherCard];
[card match:cards];

创建所有这些对象,然后根据需要传递给方法。

我想你的问题是关于这个循环:

for (Card *card in otherCards) {
    ...
}
我们如何将*otherCards声明为NSArray的实例,然后使用它呢

您不需要alloc和init
otherCards
,因为它是作为参数提供给函数
match
。调用方负责初始化它。您无法回避初始化,只是在其他地方进行了初始化:

Card * myCard = ...               // init the varible here
NSArray * otherCards = ...        // init the array here
int n = [myCard match:otherCards] // otherCards is now initialized. Don't need to 
                                  // do it again inside your method
我们如何声明类
Card
的一个实例,即
*Card
,并在
for
循环中将其用作迭代变量

不是新对象。它只指向
otherCards
数组中的现有对象,因此不需要alloc和init

您确实在
for
循环中将
card
声明为
card
类型的指针:
for(card*card in otherCards)
。这是一种使代码更简洁的语法糖。如果您愿意,您可以通过漫长的道路完成:

Card * card;
for (card in otherCards) {
    // do something
}

我想你的问题是关于这个循环:

for (Card *card in otherCards) {
    ...
}
我们如何将*otherCards声明为NSArray的实例,然后使用它呢

您不需要alloc和init
otherCards
,因为它是作为参数提供给函数
match
。调用方负责初始化它。您无法回避初始化,只是在其他地方进行了初始化:

Card * myCard = ...               // init the varible here
NSArray * otherCards = ...        // init the array here
int n = [myCard match:otherCards] // otherCards is now initialized. Don't need to 
                                  // do it again inside your method
我们如何声明类
Card
的一个实例,即
*Card
,并在
for
循环中将其用作迭代变量

不是新对象。它只指向
otherCards
数组中的现有对象,因此不需要alloc和init

您确实在
for
循环中将
card
声明为
card
类型的指针:
for(card*card in otherCards)
。这是一种使代码更简洁的语法糖。如果您愿意,您可以通过漫长的道路完成:

Card * card;
for (card in otherCards) {
    // do something
}

对不起,我不能选择两个公认的答案,它们都同样有用。谢谢你的回答。对不起,我不能选择两个被接受的答案,它们都同样有用