我在我的代码中调试了一些东西并意识到以下编译
NSMutableSet *s = [[NSMutableArray alloc] init];
Card *c = [[Card alloc] init];
[s addObject:c];
[s addObject:c];
[s addObject:c];
NSLog(@"Set now contains %d cards ", [s count]); //Prints 3
但声明的类型是这里的Set ..为什么允许重复?为什么要编译呢?
答案 0 :(得分:4)
[[NSMutableArray alloc] init]
返回类型id
,这是Objective-C返回类型id
的标准。在许多情况下,实际返回的类型取决于类的实现,许多Apple提供的类是类集群并返回不同的类型。一个常见的例子是NSString
,其中通常返回类NSCFString
的实例。
注意匹配类名非常重要。
的答案答案 1 :(得分:2)
[[NSMutableArray alloc] init]
返回id
,如@CocoaFu所述。您将其分配给声明为NSMutableSet
的指针,由于返回id
,该指针是可接受的。像大多数其他语言一样,仅仅因为你宣称它是一个NSMutableSet
而不是一个。
由于NSMutableSet
和NSMutableArray
都有一个名为-addObject:
的方法,编译器不会发出有关被调用的未知方法的警告。
除了指针之外,您的代码中没有特定的错误,如声明的那样,是不准确的。