diff options
author | Ben Pious <benpious@gmail.com> | 2015-10-30 21:40:19 -0700 |
---|---|---|
committer | Ben Pious <benpious@gmail.com> | 2015-10-30 21:40:19 -0700 |
commit | 4508ee45d8924ee7b17ec1fa856f4e273c1ca5c1 (patch) | |
tree | 0e4de65b57a48d6c22c2d69b8ca5a31163f1c7d9 /objective-c.html.markdown | |
parent | f0a4c88acfac9514aca6dd33e2d3f8c4d5e815dc (diff) |
Adds description of how to define generic classes in Xcode 7.0
Diffstat (limited to 'objective-c.html.markdown')
-rw-r--r-- | objective-c.html.markdown | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/objective-c.html.markdown b/objective-c.html.markdown index f130ea0c..05bb5c6a 100644 --- a/objective-c.html.markdown +++ b/objective-c.html.markdown @@ -599,6 +599,52 @@ int main (int argc, const char * argv[]) { @end +// Starting in Xcode 7.0, you can create Generic classes, +// allowing you to provide greater type safety and clarity +// without writing excessive boilerplate. +@interface Result<__covariant A> : NSObject + +- (void)handleSuccess:(void(^)(A))success + failure:(void(^)(NSError *))failure; + +@property (nonatomic) A object; + +@end + +// we can now declare instances of this class like +Result<NSNumber *> *result; +Result<NSArray *> *result; + +// Each of these cases would be equivalent to rewriting Result's interface +// and substituting the appropriate type for A +@interface Result : NSObject +- (void)handleSuccess:(void(^)(NSArray *))success + failure:(void(^)(NSError *))failure; +@property (nonatomic) NSArray * object; +@end + +@interface Result : NSObject +- (void)handleSuccess:(void(^)(NSNumber *))success + failure:(void(^)(NSError *))failure; +@property (nonatomic) NSNumber * object; +@end + +// It should be obvious, however, that writing one +// Class to solve a problem is always preferable to writing two + +// Note that Clang will not accept generic types in @implementations, +// so your @implemnation of Result would have to look like this: + +@implementation Result + +- (void)handleSuccess:(void (^)(id))success + failure:(void (^)(NSError *))failure { + // Do something +} + +@end + + /////////////////////////////////////// // Protocols /////////////////////////////////////// |