服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - Objective-C中的语法糖示例详解

Objective-C中的语法糖示例详解

2021-04-13 16:46周强 IOS

开发过程中我特别喜欢用语法糖,原因很简单,懒得看到一堆长长的代码,但语法糖简单却不那么简单,下面这篇文章主要给大家介绍了关于Objective-C中语法糖的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

语法糖

语法糖(syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(peter j. landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。

——维基百科

需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率。

通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会,本文在简单的介绍 oc 语法糖的同时也会跟大家分享下我们使用过程中发现的'新'问题。下面话不多说了,来一起看看详细的介绍吧。

语法糖的自白

先举个生活中的:

  • 老班:为了传达教育局和学校的教育精神我来讲几句。
  • 老班:下面我要讲啦啊。
  • 老班:我要讲的是教育局和学校刚传达的规定。
  • 老班:最近校长发现迟到学生越来越多。
  • 老班:为了维护教学秩序,学校制定了新校规。
  • 老班:.....
  • 小明:说人话!
  • 老班:从明天起7点钟准时到校上课!

老班巴拉巴拉讲了一堆,其实只是要表达*从明天起 7 点钟准时到校上课!*虽然最终能表达出效果,但是老班说的累小明们听着也烦。举这个例子可能比较极端,至少我没有遇到这么啰嗦的老师。但在编程语言中的确有不少让程序员感到罗嗦的语法,让人不能忍,这个时候语法糖 就派上了用场。

比如oc取数组元素:

?
1
id element = [array1 objectatindex:0];

oc 语法糖:你看,我是不是写起来很方便?

?
1
id element = array1[0];

oc 语法糖:往下看,我还能做更多呢。

oc语法糖

@[] 和 @{}

nsarray

一般数组的初始化和访问数组元素是这样的:

?
1
2
3
4
// nsarray 的 alloc 初始化
nsarray *array1 = [[nsarray alloc] initwithobjects:@"a", @"b", @"c", nil];
// nsarray 的便捷构造
nsarray *array2 = [nsarray arraywithobjects:@"1", @"2", @"3", nil];

获取数组中的元素可以这样的:

?
1
2
3
// 获取相应索引的元素
id element = [array1 objectatindex:0];
nslog(@"array1_count = %d, array[0] = %@",[array1 count], element);

如果使用语法糖,可以这样写:

?
1
2
3
4
5
6
7
// nsarray的定义
nsarray *array = @[@"lu", @"da", @"shi", @yes, @123];
int count = (int)[array count];
for (int i = 0; i < count; i++)
{
 nslog(@"%@", array[i]);
}

nsdictionary

字典的初始化一般是这样的:

?
1
2
3
nsdictionary *dictionay = [nsdictionary dictionarywithobjectsandkeys:@"value1", @"key1", @"value2", @"key2", nil];
id value = [dictionay objectforkey:@"key1"];
nslog(@"key1 => %@", value);

我们还可以这样简化:

?
1
2
3
4
5
6
nsdictionary *dictionary = @{
    @"key0" : @"value0",
    @"key1" : @"value1",
    @"key2" : @"value2"
    };
nslog(@"key2 => %@", dictionary[@"key2"]);

事实上 [ ] 和 { } 在json数据格式中最常见了,[ ] 一般封装一个数组,{ } 一般封装一个整体对象。

nsnumber

一般写法是这样的:

?
1
2
3
nsnumber *intnumber = [nsnumber numberwithint:123];
nsnumber *floatnumber = [nsnumber numberwithfloat:12.3];
nsnumber *charnumber = [nsnumber numberwithchar:@('a')];

语法糖简化写法:

?
1
2
3
4
nsnumber *a = @123;
nsnumber *b = @12.3;
nsnumber *c = @('a');
nslog(@"a = %@, b = %@, c = %@", a, b, c);

. 点语法

再用数组 nsarray *array = @[@"lu", @"da", @"shi", @yes, @123]; 举例。想要获取数组中有多少个元素,我们平时都是怎么做的?

[array count] 还是 array.count?

老司机们思索片刻后说到:好像都用过,但是...我们知道在 oc 中 [] 和 . 分别代表调用方法和属性,看申明明明是属性呀,怎么可以用 . 方法?

从 oc 2.0 开始只要符合系统默认 setter、getter 书写格式的方法都可以使用. 点语法,属性是一对 getter、setter 方法,点语法是属性的另一种调用格式,就是语法糖方法。这么做的目的只有一个,就是增加可读性、兼容常见用法减少代码报错!

oc语法糖带来的'坑'

一般我们认为语法糖带来了方便,特别是对于字典的初始化 直接是key:value的赋值方式比 dictionarywithobjectsandkeys 这种反人类的方式友好的多。

但真的没有其他什么问题吗?看下下面两个定义及运行结果:

Objective-C中的语法糖示例详解

Objective-C中的语法糖示例详解

可见 dictionarywithobjectsandkeys 如果遇到 value 为 nil 的情况,后续 key-value 不会入库直接当做末尾 nil 结束初始化;

而语法糖的方式就直接崩溃了,对崩溃了。

所以使用语法糖还需要注意数据合法性问题,nil 会造成意外的崩溃哦!

基本原理

语法糖就是语言中的一个构件,当去掉该构件后并不影响语言的功能和表达能力。而使用语法糖语言的处理器,包括编译器,静态分析器等,会在处理之前把语法糖构件转换成加糖之前的构件,这个过程通常被称为:desugaring。说白了,语法糖就是对现有语法的一个封装,编译运行的时候再脱掉这层糖衣变为老的语法实现。

写在最后

之所以叫「语法」糖,不只是因为加糖后的代码功能与加糖前保持一致,更重要的是糖在不改变其所在位置的语法结构的前提下,实现了运行时等价。可以简单理解为,加糖后的代码编译后跟加糖前一摸一样。

之所以叫语法「糖」,是因为加糖后的代码写起来很爽,包括但不限于:代码更简洁流畅,代码更语义自然,写得爽,看着爽!

「糖」也可能有毒,使用需谨慎。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://mp.weixin.qq.com/s/OTJdgt44sbek5-1yntMoQg

延伸 · 阅读

精彩推荐
  • IOS谈一谈iOS单例模式

    谈一谈iOS单例模式

    这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下...

    彭盛凇11872021-01-19
  • IOSiOS10 Xcode8适配7个常见问题汇总

    iOS10 Xcode8适配7个常见问题汇总

    这篇文章主要为大家详细汇总了iOS10 Xcode8适配7个常见问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    索马里猫10332021-02-01
  • IOSiOS中时间与时间戳的相互转化实例代码

    iOS中时间与时间戳的相互转化实例代码

    这篇文章主要介绍了iOS中时间与时间戳的相互转化实例代码,非常具有实用价值,需要的朋友可以参考下。...

    张无忌!4812021-03-09
  • IOSiOS逆向教程之logify跟踪方法的调用

    iOS逆向教程之logify跟踪方法的调用

    这篇文章主要给大家介绍了关于iOS逆向教程之logify跟踪方法调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    Mr.Guo11472021-04-28
  • IOSxcode8提交ipa失败无法构建版本问题的解决方案

    xcode8提交ipa失败无法构建版本问题的解决方案

    xcode升级到xcode8后发现构建不了新的版本。怎么解决呢?下面小编给大家带来了xcode8提交ipa失败无法构建版本问题的解决方案,非常不错,一起看看吧...

    Cinna丶7542021-02-03
  • IOSiOS APP实现微信H5支付示例总结

    iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一张小A11332021-06-01
  • IOSiOS常见的几个修饰词深入讲解

    iOS常见的几个修饰词深入讲解

    这篇文章主要给大家介绍了关于iOS常见的几个修饰词的相关资料,iOS修饰词包括assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite,文中通过示...

    郡王丶千夜7422021-05-10
  • IOSIOS网络请求之AFNetWorking 3.x 使用详情

    IOS网络请求之AFNetWorking 3.x 使用详情

    本篇文章主要介绍了IOS网络请求之AFNetWorking 3.x 使用详情,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    总李写代码6892021-03-04