objective-c中实现函数重载(黑魔法:__attribute__((overloadable)))

总所周知,oc中不像java,c++一样可以实现函数重载。

- (void)test:(float)value {}

- (void)test:(int)value {}

这样xocde会报错。

所以有时候如果我们想要实现一下函数重载就要混编,或者是通过一下的方法:

1.如果参数是对象的话:

- (void)test:(id)value {

if ([value isKindOfClass:[NSString class]]) {

NSLog(@"NSString");

}

else if ([value isKindOfClass:[NSDictionary class]]) {

NSLog(@"NSDictionary");

}

else if ([value isKindOfClass:[NSArray class]]) {

NSLog(@"NSArray");

}

else {

NSLog(@"摩擦摩擦");

}

}

2.如果参数是基本类型的话,很可能就会这样了:

- (void)testInt:(int)value {

NSLog(@"int");

}

- (void)testFloat:(double)value {

NSLog(@"double");

}

- (void)testLong:(long)value {

NSLog(@"long");

}

虽然我们可以有很多方法达到我们的最终目的,但是能否找到更加优雅的方式解决问题。

现在我们来介绍下黑魔法:

__attribute__((overloadable))

然后简单写了一个demo,一看就明白它是怎么用的了

@interface ViewController ()

@end

NSString * __attribute__((overloadable)) mytest(NSString *x) {return @"aa";}

NSString * __attribute__((overloadable)) mytest(NSNumber *x) {return @"bb";}

NSString * __attribute__((overloadable)) mytest(NSDictionary *x) {return @"cc";}

NSString * __attribute__((overloadable)) mytest(int x) { return @"int"; }

NSString * __attribute__((overloadable)) mytest(double x) { return @"double"; }

NSString * __attribute__((overloadable)) mytest(long x) { return @"long"; }

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

NSLog(@"%@", mytest(133333333));

}

@end

很简单是吧!

你可能感兴趣的:(objective-c中实现函数重载(黑魔法:__attribute__((overloadable))))