Objective C Generics
Objective C Generics是github上一个仿C++, Java, C#中范型的Objective C的实现.
用法如下:
将 ObjectiveCGenerics.h 拖进你的项目.在定义一个新类的时候,使用 GENERICSABLE宏声明一下.
#import "ObjectiveCGenerics.h" GENERICSABLE(MyClass) @interface MyClass : NSObject@property (nonatomic, strong) NSString* name; @end
之后你就能像C++, Java, C#里边一样使用范型了.
ObjectiveCGenerics.h源码如下:
//Copyright 2013 Tomer Shiri generics@shiri.info // //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. #if NS_BLOCKS_AVAILABLE #define GENERICSABLE(__className) \ GENERICSABLEWITHOUTBLOCKS(__className) \ GENERICSABLEWITHBLOCKS(__className) #else #define GENERICSABLE(__className) GENERICSABLEWITHOUTBLOCKS(__className) #endif #define GENERICSABLEWITHOUTBLOCKS(__className)\ @protocol __className\ @end \ @class __className; \ typedef NSComparisonResult (^__className##Comparator)(__className* obj1, __className* obj2); \ \ @interface NSEnumerator (__className##_NSEnumerator_Generics) <__className> \ - (__className*)nextObject; \ - (NSArray<__className>*)allObjects; \ @end \ \ @interface NSArray (__className##_NSArray_Generics) <__className> \ \ - (__className*)objectAtIndex:(NSUInteger)index; \ - (NSArray<__className>*)arrayByAddingObject:(__className*)anObject; \ - (NSArray*)arrayByAddingObjectsFromArray:(NSArray<__className>*)otherArray; \ - (BOOL)containsObject:(__className*)anObject; \ - (__className*)firstObjectCommonWithArray:(NSArray<__className>*)otherArray; \ - (NSUInteger)indexOfObject:(__className*)anObject; \ - (NSUInteger)indexOfObject:(__className*)anObject inRange:(NSRange)range; \ - (NSUInteger)indexOfObjectIdenticalTo:(__className*)anObject; \ - (NSUInteger)indexOfObjectIdenticalTo:(__className*)anObject inRange:(NSRange)range; \ - (BOOL)isEqualToArray:(NSArray<__className>*)otherArray; \ - (__className*)lastObject; \ - (NSEnumerator<__className>*)objectEnumerator; \ - (NSEnumerator<__className>*)reverseObjectEnumerator; \ - (NSArray<__className>*)sortedArrayUsingFunction:(NSInteger (*)(__className*, __className*, void *))comparator context:(void *)context; \ - (NSArray<__className>*)sortedArrayUsingFunction:(NSInteger (*)(__className*, __className*, void *))comparator context:(void *)context hint:(NSData *)hint; \ - (NSArray<__className>*)sortedArrayUsingSelector:(SEL)comparator; \ - (NSArray<__className>*)subarrayWithRange:(NSRange)range; \ - (NSArray<__className>*)objectsAtIndexes:(NSIndexSet *)indexes; \ - (__className*)objectAtIndexedSubscript:(NSUInteger)idx NS_AVAILABLE(10_8, 6_0); \ \ + (NSArray<__className>*)array; \ + (NSArray<__className>*)arrayWithObject:(__className*)anObject; \ + (NSArray<__className>*)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt; \ + (NSArray<__className>*)arrayWithObjects:(__className*)firstObj, ... NS_REQUIRES_NIL_TERMINATION; \ + (NSArray<__className>*)arrayWithArray:(NSArray<__className>*)array; \ \ - (NSArray<__className>*)initWithObjects:(const id [])objects count:(NSUInteger)cnt; \ - (NSArray<__className>*)initWithObjects:(id)