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)
然而我觉得很傻逼
___________________________________________________
专注iOS/前端开发,广泛涉猎多种平台和技术,欢迎交流
可以在微博关注并@沈z伟