-
-
Save cdzombak/2a8afa922e7af6dbb974 to your computer and use it in GitHub Desktop.
swift-style as in ObjC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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