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)
您可以使用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
只接受某些类的子类.但请注意NSMutableArray和NSArray的子类注释,因为它们是类集群,因此不容易子类化.
注意:在我的另一个答案中,我创建了一个NSMutableArray
子类,如果满足某个要求,则使用块来测试.如果您针对类成员身份进行测试,这将完全符合您的要求.使用第二个块进行错误处理.
自Xcode 7发布以来,Apple已经增加了对Objective-C泛型的支持.
NSArray <NSString *> *arrayOfStrings = @[@"a", @"b"];
NSDictionary <NSString *, NSDate *> *dictionaryOfDates = @{ @"a" : @1 };
Run Code Online (Sandbox Code Playgroud)