Objective-C是否支持泛型?

Jam*_*sev 12 generics cocoa-touch objective-c

我想知道Objective-C是否为泛型提供任何支持?

例如,考虑一种方法:

-(void) sort: (NSMutableArray *) deck {
}
Run Code Online (Sandbox Code Playgroud)

我有什么方法可以让它只处理卡片组?
这样的事情可以强制执行吗?

-(void) sort: (NSMutableArray <Card *>) deck {
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*j T 11

Objective C现在使用XCode 7支持泛型.

如果类型不匹配,XCode 7编译器将为您提供编译器警告.

例如,以下行将引发编译器警告,因为数组中的第二个对象导致类型不匹配.该数组仅允许NSString对象.

NSArray <NSString *> *myArray = [@"str2", @1, @"str2"];
Run Code Online (Sandbox Code Playgroud)


Vik*_*ica 6

您可以使用objective-c运行时提供的内省工具.

基本上,它意味着您可以检查数组中的所有对象是一(A类或它的一个子类)还是成员(A类),或者对象是否符合协议响应选择器(存在某种方法).

-(void) sort: (NSMutableArray *) deck {
    for(id obj in deck){
        if(obj isKindOfClass:[A class]]){
            //this is of right class
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以NSArray在每个对象的结账上写一个Category方法.

BOOL allAreKindOfA = [array allObjectsAreKindOfClass:[A class]];
Run Code Online (Sandbox Code Playgroud)

通常你实际上并不经常需要这个,因为你知道你把它放在一个集合中.

如果需要检查数组中对象的类型或能力,这可能是您的体系结构已损坏的指示器


另一个选项可能是NSMutableArray只接受某些类的子类.但请注意NSMutableArrayNSArray的子类注释,因为它们是类集群,因此不容易子类化.

注意:在我的另一个答案中,我创建了一个NSMutableArray子类,如果满足某个要求,则使用块来测试.如果您针对类成员身份进行测试,这将完全符合您的要求.使用第二个块进行错误处理.


Ped*_*eno 5

自Xcode 7发布以来,Apple已经增加了对Objective-C泛型的支持.

NSArray <NSString *> *arrayOfStrings = @[@"a", @"b"];

NSDictionary <NSString *, NSDate *> *dictionaryOfDates = @{ @"a" : @1 };
Run Code Online (Sandbox Code Playgroud)