Objc是一门非常啰嗦的语言,而且历史悠久,背靠C语言,发展缓慢。自从苹果有了新宠swift,更是对他不管不顾了,所以有很多现代语言拥有的优秀特性,Objc都无法享受到。其中一项就是类型推断。
每次我们在定义变量的时候,都需要先写类型,而Objc中类型名字又往往非常的长,所以很多时候一行初始化代码就让我们感到非常冗长。
MYDoSomethingViewController *viewController = [[MYDoSomethingViewController alloc] init];
而大部分时间,这些变量的含义相当明确,我们也并不需要去知道具体的类型,而我们却要每次去声明一次,显得非常多余。
得益于C语言的发展,在2015年,GCC和LLVM都先后的支持了类型推断,这样我们可以用于日常开发来增加代码可读性和简洁性。
首先我们定义两个类型推断关键字:
#define var __auto_type
#define let __auto_type const
以下是两者的对比:
- (void)t {
let view = [UIView new];
view.backgroundColor = UIColor.redColor;
let dict = @{ @"view": view };
__weak let wself = self;
__block var num = 0;
let block = ^(UIView *view, NSDictionary *dict) {
__strong let self = wself;
num = 1;
[self func];
};
block(view, dict);
for (var i = 0; i < 5; i++) {
}
}
- (void)t {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];;
view.backgroundColor = UIColor.redColor;
NSDictionary *dict = @{ @"view": view };
__weak typeof(self) wself = self;
__block NSInteger num = 0;
void(^block)(UIView *view, NSDictionary *dict) = ^(UIView *view, NSDictionary *dict) {
__strong typeof(wself) self = wself;
num = 1;
[self func];
};
block(view, dict);
}
遗憾的是,由于这个特性是C语言的特性,所以目前无法识别oc中的一些特定语法,比如forin和容器模板类型。