Swift anonymous function 函数 省略规则

一直在用OC写代码,对swift没有什么研究,一直想着不就一个新语言嘛,到用的时候顺便学习一下规则就行了,api那不就是那些,他swift还能玩出花儿来...

然后接下来的悲剧大家也能猜到了,真正想看的时候完全看不懂...

每天看着语言排行榜上OC每况愈下,swift 像个青春期的骚年一样蹭蹭蹭往上长,我这个拙计呀!

江湖有传言说swift比OC容易,经过这几天的了解,我感觉不尽然,至少我不敢这么说..

在我看来,swift 犹如暴雪的游戏一般,容易上手,难于精通。OC的规则有些死板,像是一个有限的空间,即便是高手,也只能在这里玩(虽然有些按耐不住去玩runtime),一般人感觉自己也在这个空间似乎与高手差别不大,至少读大神的源码坎儿不多。但swift就不一样了,太灵活,将来必成各种高手炫技虐菜的血腥战场...如果我还是拿着OC翻译swift的思路来写代码,早晚成刀下之鬼,饭碗怎么丢的都不知道...

像是函数这种,在OC里面一直规规矩矩的东西,硬是被swift玩残了,看代码的时候只想爆粗口,这他么什么东西,这他么又是什么东西!写代码的时候,我擦,怎么又报错!这样都不行?!现在在读 Matt Neuburg 的 <iOS 9 Programming Fundamentals> ,函数这一章讲的细致入微,心中有些了然,且分享出来给大家,内容多出自此书,自己只是梳理一下,还希望多多指正。

完整书写形式 一个简单动画函数


func animationAction () {

self.view.backgroundColor=UIColor.redColor()

}

func completion ( finished :Bool) ->Void{

print("Animation Completed !!")

}

UIView.animateWithDuration(2.0, animations:animationAction, completion:completion)

简化步骤1 : 将作为参数的函数变成无名函数 Anonymous Function

通常,在函数不需要重用,而且又仅仅作为参数传递给另一个函数的情况下,我们可以省略他的函数名,变成无名函数

变化规则:

a. 省略函数名 保留花括号 {}

b. 把参数列表和返回参数 (即函数类型) 写在{}第一行

c. 用 in 将 函数类型 与 函数体 区分开来

经过步骤1,简化后的代码如下:


UIView.animateWithDuration(2.0, animations: {

() ->Void/*函数类型*/ in

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

(finished :Bool) ->Void /*函数类型*/   in

print("animationCompleted")//函数体

})

简化步骤2:

省略返回类型, 当编译器已知该函数返回类型的时候

经过步骤2,简化后的代码如下:

UIView.animateWithDuration(2.0, animations: {

  ()  /*函数类型*/   in

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

(finished :Bool) /*函数类型*/  in

print("animationCompleted")//函数体

})

简化步骤3: 省略参数列表和in, 当没有参数的时候

经过步骤3,简化后的代码如下:

UIView.animateWithDuration(2.0, animations: {

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

(finished :Bool)/*函数类型*/  in

print("animationCompleted")//函数体

})

简化步骤4: 省略参数类型和参数列表括号,当编译器已知参数类型的时候

经过步骤4,简化后的代码如下:


UIView.animateWithDuration(2.0, animations: {

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

finished/*函数类型*/   in

print("animationCompleted")//函数体

})

简化步骤5: �省略 函数类型和in ,并使用$0,$1等访问参数,当编译器已知参数类型的时候

经过步骤5,简化后的代码如下:

UIView.animateWithDuration(2.0, animations: {

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

//省略函数类型和in

print("animationCompleted\($0)")//直接访问变量,

})

简化步骤6: �省略 函数类型和in ,不访问函数参数

规则: 使用下划线 _ 代替整个参数列表

经过步骤6,简化后的代码如下:


UIView.animateWithDuration(2.0, animations: {

self.view.backgroundColor=UIColor.redColor()//函数体

}, completion: {

_-> () in

//or 继续省略返回类型

// _ in

print("animationCompleted")//不需要引用任何参数

})

注:通过步骤5和6,说明一个规律。作者原文如下:

But note that if the anonymous function takes parameters, you must acknowledge them somehow. You can omit the in line and use the parameters by the magic name $0 and so on, or you can keep the in line and ignore the parameters with an underscore, but you can't omit the in line altogether and not use the parameters by their magic names! If you do, your code won't compile.

中文(当然是自己翻译的):

如果一个无名函数有参数,你必须以下面两种方式之一告知编译器。

当你需要引用变量的时候,可以省略函数类型和in ,使用$x访问这些变量;

当你无需引用变量的时候,保留 in 使用 _ 代替参数列表。

不能省略函数类型和in的同时,还不使用$n 引用变量,这样将不能编译通过。

简化步骤7: �省略无名函数的caller函数的参数名称 (trailing function syntax)

规则: 当且仅当无名函数作为caller函数的最后一个参数的时候,

可以省略最后一个参数名称(即把caller函数结束标志的 ")" 放在倒数第二个参数的末尾)

将此无名函数紧跟在 ")" 后面,作为最后一个参数

经过步骤7,简化后的代码如下 (也是我们简化此函数调用的最终形态):


UIView.animateWithDuration(2.0, animations: {

self.view.backgroundColor=UIColor.redColor()//函数体

}) { //提前结束函数括号 ")" 并把此无名函数紧跟其后

_in

print("animationCompleted")//函数体直接访问变量

}

其他简化规则

  1. 如果caller函数有且仅有一个参数,需要传入一个function的时候,你可以省略函数调用使用的括号(),这是swift函数调用的语法中,唯一可以省略()的情况。

例子:

func callAnotherFunction( aFunc : () -> ()) {

aFunc()

}

callAnotherFunction{ //这里省略了调用函数的()

print("This is the function as the only parameter")

}
  1. 省略有返回值函数的 return
    规则: 当函数体有且仅有一行(分号隔开不算哦..就是一个表达式),而且该行作为表达式的值的类型与函数返回类型一致的时候,
    编译器会默认该行的值就是你要返回的值

例子1:

func sayHowdy () ->String{

return"Howdy"

}

func perfermAndPrint (f: () ->String) {

lets = f()

print(s)

}

perfermAndPrint{

sayHowdy()//默认返回该行的值等效于return sayHowdy()

}

例子2: 数组的map 函数

let numArr = [1,2,3,4]

//完整写法

let tripleArr =numArr.map({(n :Int) ->Intin

return n *3

})

print(tripleArr)// [3,6,9,12]

//等效简写

let doubleArr = numArr.map{

n in

n *2

}

print(doubleArr)//[2,4,6,8]

//省略 in 的简写

let tenthArr = numArr.map{10* $0 }

print(tenthArr) // [10, 20, 30, 40]

第一次分享,如有不足还请多多指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,434评论 0 35
  • 今天叶武滨老师和我们分享了强连接和弱连接的概念,并重点强调了弱连接的作用。所谓强连接是我们情感的维持,主要用于夫妻...
    皓月环宇阅读 301评论 0 0
  • 公司现在9:30上班,送完孩子多出来的时间就没有回家等着到点过来,早点来公司干点自己的事吧,这半小时用来干什么都行...
    Hi_张阅读 168评论 0 0