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)

然而我觉得很傻逼 

原文地址:https://www.cnblogs.com/rayshen/p/5038937.html