美文网首页
OC中的糖衣语法

OC中的糖衣语法

作者: 爱笑的猫mi | 来源:发表于2019-02-06 19:19 被阅读0次

糖衣语法的定义

糖衣语法,又叫‘语法糖’、‘语法盐’等等,是由英国计算机科学家彼得·约翰·兰达(Peter J.Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

糖衣语法在各种语言中都有出现,最常用的就是数组的[ ]操作符的下标访问以及{ }操作符对数组的初始化,例如C语言中可以通过下标访问数组元素,这种类似[ ]和{ }操作符的符合程序员思维的简单表示方法就是所谓的糖衣语法:

/* C中的数组操作 */
int a[3] = {1,2,3};
int b = a[2];

[ ]和{ }在JSON数据格式中最常见,[ ]一般封装一个数组,{ }一般封装一个整体对象。另外在OC中用到语法糖的一个非常重要的类型是NSNumber,一个将基本数据类型封装起来的对象类型,基本数据类型像‘@3’这种表达就是NSNumber的语法糖,也推荐这种用法。

OC中的糖衣语法

糖衣语法在OC中又常叫做‘字面量’,主要用在NSString,NSNumber,NSArray,NSDictionary这些类中,使用字面量可以更清晰的看清数据的结构,而且大大减小了代码编写的复杂繁琐度,代码易读性更高。

OC中字面量的用法主要由以下几种情况,包括基本数据类型NSNumber、静态数组NSArray和字典NSDictionary、可变数组NSMultableArray和字典NSMultableDictionary。其中静态的数组和字典不能直接用[ ]操作符来通过下标访问元素或者通过键值访问元素,而可变长数组和字典可以;另外可变长数组和字典用字面量初始化时要进行multableCopy操作。

糖衣语法用法:

/** 糖衣语法【字典和数组元素中不可出现nil,会直接编译不通过】 **/
    
    /* 1.基本数据对象 */
    NSNumber *num_int = @1;
    NSNumber *num_float = @1.1f;
    NSNumber *num_bool = @YES;
    NSNumber *num_char = @'a';
    /* 类似还有:NSInteger, Double, Long, Short ... */
    
    /* 基本数据运算 */
    int operator_i = 3;
    float operator_f = 2.1f;
    NSNumber *expression = @(operator_i * operator_f);
    
    /* 2.静态数组、字典 */
    NSArray *array = @[@1, @2, @3];
    NSDictionary *dic = @{
                          @"KEY":@"VALUE",
                          @"KEY1":@"VALUE1"
                          };
    /* 访问但不可更新 */
    NSNumber *num = array[1];
    NSString *string = dic[@"KEY"];
    
    /* 3.可变数组、字典 */
    NSMutableArray *mulArray = [@[@"a", @"b", @"c"] mutableCopy];
    NSMutableDictionary *mulDic = [@{
                                     @"key": @"value",
                                     @"key1": @"value1"
                                     } mutableCopy];
    /* 可变数组元素的下标访问或键值访问以及元素更新 */
    NSString *mulstring = mulArray[1];
    mulArray[1] = @"d";
    NSString *dicstring = mulDic[@"key"];
    mulDic[@"key"] = @"value3";

原用法:

/** 对应的原语法【字典和数组元素中可以出现nil,nil会被过滤掉】 **/
    
    /* 1.基本数据对象 */
    NSNumber *num_int = [NSNumber numberWithInt:1];
    NSNumber *num_float = [NSNumber numberWithFloat:1.1f];
    NSNumber *num_bool = [NSNumber numberWithBool:YES];
    NSNumber *num_char = [NSNumber numberWithChar:'a'];
    // 类似还有:NSInteger, Double, Long, Short ...     
    /* 2.静态数组、字典 */
    NSArray *array = [[NSArray alloc]initWithObjects:@1, @2, @3, nil];
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:
                         @"VALUE", @"KEY",
                         @"VALUE1", @"KEY1", nil];
    /* 访问(静态数组元素不可更新) */
    NSNumber *num = [array objectAtIndex:1];
    NSString *string = [dic objectForKey:@"KEY"];
    
    /* 3.可变数组、字典 */
    NSMutableArray *mulArray = [[NSMutableArray alloc]initWithObjects:@"a", @"b", @"c", nil];
    NSMutableDictionary *mulDic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:
                                   @"value", @"key",
                                   @"value1", @"key1", nil];
    
    /* 访问和更新 */
    NSNumber *mulnum = [mulArray objectAtIndex:1];
    [mulArray setObject:@"d" atIndexedSubscript:1];
    NSString *mulstring = [mulDic objectForKey:@"KEY"];
    [mulDic setObject:@"value2" forKey:@"key"];

问题: OC的数组或字典中,添加nil对象会有什么问题?
数组或字典如果通过addObject函数添加nil会崩溃,但初始化时通过initWithObjects方法里面的nil会被编译器过滤去掉不会有影响。另外如果使用糖衣语法初始化数组或字典也不可以有nil,此时nil不会被过滤掉也会崩溃。

/* 1.糖衣语法 */
NSArray *array = @[@1, @2, @3, nil]; // 错误,不可有nil,会编译不通过:void*不是Objective-C对象 NSDictionary *dic = @{
                      @"KEY":@"VALUE",
                      @"KEY1":@"VALUE1",
                      @"KEY2":nil
                       }; // 语法就是错误的,编译不通过                        
/* 2.原用法 */
NSMutableArray *mulArray = [[NSMutableArray alloc] initWithObjects:@1, @2, @3, nil]; // 正确,没毛病 NSMutableDictionary *mulDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                         @"VALUE", @"KEY",
                         @"VALUE1", @"KEY1", nil]; // 正确,没毛病 /* 下面添加nil都会编译警告,运行起来会崩溃 */
[mulArray addObject:nil];
[mulDic setObject:nil forKey:@"KEY2"];

问题: Objective-C中的可变和不可变类型是什么?

Objective-C中的mutable和immutable类型对应于动态空间分配和静态空间分配。最常见的例子是数组和字典。例如NSArray和NSMutableArray,前者为静态数组,初始化后长度固定,不可以再动态添加新元素改变数组长度;后者为动态数组,可以动态添加或者删除元素,动态申请新的空间或释放不需要的空间,伸缩数组长度。

问题: @[@"a",@"b"];该类型是?
字符串对象
字典对象
数组对象 (right)
集合对象

相关文章

  • OC中的糖衣语法

    糖衣语法的定义 糖衣语法,又叫‘语法糖’、‘语法盐’等等,是由英国计算机科学家彼得·约翰·兰达(Peter J.L...

  • JavaScript 语法糖 总结

    ## JavaScript 语法糖 作用 1.语法糖(Syntactic sugar),也译为糖衣语法。 2....

  • Swift基础语法-switch--对比OC

    1. Swift语法中 switch与 OC 中的比较 在 OC 中的 switch格式: switch(需要匹配...

  • Java语法糖汇总解析

    Java语法糖: 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法...

  • iOS 之Masonry点语法简单实现 OC链式(点)语法

    常见的OC中括号链式语法 Masonry 上图: 点语法:在 Objective-C 中,对于点语法的使用,最常见...

  • OC之01基础之基础语法

    01 语法概述 不妨将OC说成是面向对象的C语言,因为OC是在C语言的基础是建立的,而且在OC的语法中是完全...

  • 总纲

    一句代码创建常用UI控件类与对象OC中面向对象的编程思想OC基础语法复习OC中的协议OC中的block学习导航栏按...

  • 掘金优秀Android文章

    [译]带你揭开Kotlin中属性代理和懒加载语法糖衣 https://zhuanlan.zhihu.com/p/6...

  • Java中的语法糖

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin ...

  • 详解12个Java语法糖,再搞不懂,别说自己会Java

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin ...

网友评论

      本文标题:OC中的糖衣语法

      本文链接:https://www.haomeiwen.com/subject/ozsisqtx.html