Objective C从指针生成整数而没有将对象作为args传递对象

Gor*_*son 4 iphone cocoa objective-c

我正试图在目标C中制作二十一点,并且在传递物体方面遇到了麻烦.我的Hand类基本上需要一个牌组并从中抽取牌,将它们添加到阵列中.

这是涉及的Hand方法:

- (id)init : (Deck*) deck
{
    [self draw: deck];
    [self draw: deck];
    return self;
}

- (void)draw: (Deck*)deck;
{
    Card* C= [deck drawFromDeck];
    [cards addObject: C];
}
Run Code Online (Sandbox Code Playgroud)

这是主要问题的一部分:

Deck* deck=[[Deck alloc] init];
Hand* hand=[[Hand alloc] init: deck ];
Run Code Online (Sandbox Code Playgroud)

第二行得到"指针没有强制转换的整数"错误.每当我运行代码时,手中都没有卡片,因为没有可以从中抽取的卡片(我认为:)).我需要以不同的方式传递或解析Deck*吗?(如果你需要我发布更多代码,请问)

多谢你们!!:d



关于赏金的编辑:虽然我确实相信我接受的答案得到了很好的解释,但这个问题在过去的一年半里平均每天获得超过17次的观点.这意味着这个问题可能是许多人对stackoverflow的第一次体验,而改进它不仅会向我们展示更好的光线,它可能会节省很多人的时间.虽然它现在有很好的答案,但我想确保它尽可能完美,特别是因为我们并不知道有多少人能够遵循它并解决他们的问题.

继续并提交现有答案的编辑或添加自己的答案.(Mods,你认为这对社区维基来说是个好人吗?)

Jes*_*sak 12

根据您在下面发布的额外代码,问题在于您有两个名称相同但参数不匹配的方法,即- (id)init: (Deck*)deck- (id)init: (int)newvalue.

通常这不是问题,但在这种情况下,类型在结构上是不同的 - 指针和int.编译器可以根据接收器的类型区分您的意思,但这仅在其具有静态类型时才有效.例如,如果你有:

Hand *h = [Hand alloc];
h = [h init: deck];
Run Code Online (Sandbox Code Playgroud)

它会停止给你一个警告.这是非常不寻常的代码,但是 - alloc和init几乎总是在同一行上.

因为alloc返回一个id,而不是Hand它不知道init调用[[Hand alloc] init:deck]是a Hand,而不是a Card.有关详细信息,请参阅Apple有关静态类型的文档.

最简单(也是合理的)解决方案是重命名方法以指示参数的类型.例如,您可以使用initWithCardValue:initWithDeck:.

编辑:此外,是的,请注意其他帖子中有关init方法中正确行为的建议.(它没有引起警告,但可能导致了段错误.)