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和容器模板类型。