Objective c 为什么我们可以在方法的实现中使用自定义/基础类的实例,而不首先对该实例执行alloc和init?
这个问题基于斯坦福iOS系列2014(objective-c)第一堂课的代码 我们创建了一个名为Objective c 为什么我们可以在方法的实现中使用自定义/基础类的实例,而不首先对该实例执行alloc和init?,objective-c,Objective C,这个问题基于斯坦福iOS系列2014(objective-c)第一堂课的代码 我们创建了一个名为Card的类,其中包括一个名为match:的方法,该方法将用于确定不同的卡牌在游戏中如何相互匹配,该方法将名为*otherCards的NSArray作为参数,在该方法的实现中,我们使用名为*Card的Card实例来迭代该数组 我的问题是-我们如何在不首先分配和实例化的情况下,声明我们的类卡实例,即*Card,并将其用作for循环中的迭代变量?同样,我们如何将*otherCards声明为NSArray的
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和initotherCards
,因为它是作为参数提供给函数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和initotherCards
,因为它是作为参数提供给函数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
}
对不起,我不能选择两个公认的答案,它们都同样有用。谢谢你的回答。对不起,我不能选择两个被接受的答案,它们都同样有用