Swift 吐槽下Swift里一个逼死强迫症的语法:中缀语法
中缀语法是OC里特有的一种,就是在函数的参数前面加一个解释词,让调用的时候明白该参数的含义
比如:
-(void)processDataWithparamaA:(NSString *)paramaA paramaB:(NSString *)paramaB{
}
调用的时候:
[self processDataWithparamaA:@"A" paramaB:@"B"];
不过你发现没,这中缀语法的前提是你必须在函数名的最前面,写个With啥的说明第一个参数的名字,否则第一个参数是没有中缀的。
这样写,确实让调用的时候看起来非常顺眼,[xxxxxxWithparamaA:@"A" paramaB:@"B"] 参数看起来好像非常一致啊,好评。
那我们再回到swift,假如我们这样声明一个函数
func processData2(paramaA:String,paramaB:String){}
但是他的调用竟然学OC的中缀,省略了第一个参数,那谁来告诉我第一个参数啥意思?。。
processData2("a", paramaB: "b")
作为一个强迫症,我不能忍啊
如果开发这个语言的是为了让我们适应OC的函数命名习惯(就是函数名里要加个Withxxx,xxx是第一个参数的中缀)
那我就必须这样声明:
func processData2WithparamaA(paramaA:String,paramaB:String){}
卧槽,这是什么鬼!!。。
然后调用呢?。。。尼玛,在括号外面了有木有。。。里面的paramaA简直毫无存在感啊
processData2WithparamaA("a", paramaB: "b")
OC调用函数是这样的 [self processDataWithparamaA:@"A" paramaB:@"B"]
两边是中括号啊
这种优雅你Swift的小括号学不来的啊。。
好在,开发Swift的那位Chris Lattner仁兄,又想到某些开发者不喜欢调用的时候带什么鸡毛中缀,于是想粗了加一个下划线来省略中缀的方法:
func processData3(paramaA:String,_ paramaB:String){}
这样,调用的时候就再也不需要写参数了,妈妈再也不担心我范强迫症了:
processData3("a", "b")
然后,夷?哪里好像不对劲? 。。意思是说,我好像完全可以这样写
func processData3(_ paramaA:String,_ paramaB:String){}
编译是能通过,但是编译器会提示你,这种写法是不规范的。(Swift 2.2中已修改可以通过编译,且第一个参数加不加下划线是一样的,在调用时均没有参数名)
这又是何必啊。。。我只是一个喜欢对称的孩子。。
给我留条生路啊。。。
最后给一个可能比较靠谱的解释就是:
swift的闭包是非常常用的,但是其调用方式和函数是一样的
为了区分,函数在调用时会省略第一个参数 callfunc(a,paramB:b),而闭包在调用时必须完整callblock(paramA:a,paramB:b)
然而我觉得很傻逼
Swift 吐槽下Swift里一个逼死强迫症的语法:中缀语法的更多相关文章
- Swift:用UICollectionView整一个瀑布流
本文的例子和Swift版本是基于Xcode7.2的.以后也许不知道什么时候会更新. 我们要干点啥 用新浪微博的Open API做后端来实现我们要提到的功能.把新浪微博的内容,图片和文字展示在colle ...
- 【Swift学习】Swift编程之旅---继承(十七)
在 Swift 中,继承是区分「类」与其它类型的一个基本特征.swift不支持多重继承.类可以调用和访问超类的方法,属性和subscripts下标,并且可以重写(override)这些方法,属性和附属 ...
- 在同个工程中使用 Swift 和 Objective-C(Swift 2.0更新)-b
本节包含内容: Mix and Match 概述(Mix and Match Overview) 在同个应用的 target 中导入(Importing Code from Within the Sa ...
- Swift互用性: 使用Objective-C特性编写Swift类(Swift 2.0版)-b
本节包括内容: 继承Objective-C的类(Inheriting from Objective-C Classes) 采用协议(Adopting Protocols) 编写构造器和析构器(Writ ...
- 【Swift学习】Swift编程之旅---方法(十五)
在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...
- 【Swift学习】Swift编程之旅---闭包(十一)
闭包是可以在代码中被传递和使用的自包含功能模块,它很像c和oc中的block,和.net中的lambdasbas表达式. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 包裹着这些常量和变量的 ...
- 【Swift学习】Swift编程之旅---字符与字符串(五)
String是swift的字符串类型.一个字符串是一个有效的字符序列,因此还可以使字符集合表示.通过+符号可以连接字符串. String 类型是一种快速.现代化的字符串实现.每一个字符串都是由独立编码 ...
- [逼死强迫症 - C&C++设计风格选择.1] : 命名规范
1.命名规范 本系列的第一篇,命名风格本就是有关艺术审美,没有美与丑的绝对标准,本文难免带有主观选择倾向,但是会尽量保持客观的态度归纳几种主流的命名风格,仅供参考.制定规范是为了方便团队沟通和利于代码 ...
- 【Swift学习】Swift编程之旅---类和结构体(十三)
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...
随机推荐
- jQuery EasyUI 1.3.4 API CHM版下载
网盘下载
- PageRank算法简介及Map-Reduce实现
PageRank对网页排名的算法,曾是Google发家致富的法宝.以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理. 一.什么是pagerank Pag ...
- hystrix-turbine 监控的使用
1. 概述 Demo地址:http://git.oschina.net/zhou666/spring-cloud-7simple/tree/master/cloud-hystrix-turbine ...
- C# WinForm捕获全局异常
网上找的C# WinForm全局异常捕获方法,代码如下: static class Program { /// <summary> /// 应用程序的主入口点. /// </summ ...
- 《ImageNet Classification with Deep Convolutional Neural Networks》 剖析
<ImageNet Classification with Deep Convolutional Neural Networks> 剖析 CNN 领域的经典之作, 作者训练了一个面向数量为 ...
- C++类功能扩展预留五招
第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...
- 使用ContentProvider进行应用程序间的数据交互
什么是ContentProvider: ContentProvider用来管理数据的访问规则.它允许你的应用程序向外界暴露需要被访问的数据. 是Android的四大组件之一. ContentProvi ...
- [转]如何判断js中的数据类型
原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...
- Dubbo_异常_服务注册运行正常但是Dubbo-Admin看不到服务(亲测可用)
一.背景: 1.Dubbo服务正常注册到ZooKeeper 2.客户端调用Dubbo服务正常 二.原因: Dubbo-Admin未配置分组信息 三.解决步骤: 1.dubbo.properties添加 ...
- chrome 26.0.XXX版本下media query流媒体查询有问题的bug
这段代码什么意思: @media only screen and (max-width: 1360px) 当用户的界面小于等于1360px的时候, 会加载该流媒体样式(此时的界面是包含滚动条的): ...