Skip to content

Instantly share code, notes, and snippets.

@cdzombak
Created February 26, 2015 18:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cdzombak/2a8afa922e7af6dbb974 to your computer and use it in GitHub Desktop.
Save cdzombak/2a8afa922e7af6dbb974 to your computer and use it in GitHub Desktop.
swift-style as in ObjC
#import <Foundation/Foundation.h>
#define as_checked(EXPR, KLASS) ({ id _obj = EXPR; NSCAssert([_obj isKindOfClass:[KLASS class]], @"Cannot cast %@ to %@", NSStringFromClass([_obj class]), NSStringFromClass([KLASS class])); _obj; })
#define as_option(EXPR, KLASS) ({ id _obj = EXPR; if (![_obj isKindOfClass:[KLASS class]]) _obj = nil; _obj; })
@interface NSObject(As)
- (instancetype)asChecked:(Class)klass;
- (instancetype)asOption:(Class)klass;
@end
@implementation NSObject(As)
- (instancetype)asOption:(Class)klass {
return [self isKindOfClass:klass] ? self : nil;
}
- (instancetype)asChecked:(Class)klass {
NSAssert([self isKindOfClass:klass], @"Cannot cast %@ to %@", NSStringFromClass([self class]), NSStringFromClass(klass));
return self;
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
NSString *x = @"x";
NSNumber *y = @(1);
NSString *xx = as_option(x, NSString); // xx == x
NSString *yy = as_option(y, NSString); // yy == nil
NSLog(@"%@ ; %@", xx, yy);
xx = [x asOption:NSString.class]; // xx = x
yy = [y asOption:NSString.class]; // yy = nil
NSLog(@"%@ ; %@", xx, yy);
xx = as_checked(x, NSString.class); // xx == x
xx = [x asChecked:NSString.class];
yy = as_checked(y, NSString); // Cannot cast __NSCFNumber to NSString
yy = [y asChecked:NSString.class]; // Cannot cast __NSCFNumber to NSString
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment