Swift3.0-函数和闭包

使用func 声明一个函数。通过函数名称和参数调用一个函数。使用->区分参数名和函数返回的类型。

func greet(person:String,day:String)-> String {
       return "Hello \(person), today is \(day)."
}
greet("Bob",day:"Tuesday")

函数的参数可以有外部参数名和内部参数名,外部参数名标记函数传入的参数,内部参数名在函数实现的地方使用。_表示没有外边参数名。

func greet(on person:String, _ day:String)->String{
       return "Hello \(person), today is \(day)."
}
greet(on: "John", "Wednesday")

一个函数需要返回多个值可以使用元组。元组中的元素可以使用名称和下标访问。

func caculateStatistics(scores:[Int])->(min:Int,max:Int,sum:Int){
        var min = scores[0]
        var max = scores[0]
        var sum = 0

for score in scores {
         if score > max {
              max = score
         }else if score < min {
              min = score
         }
  
        sum +=score
       }

    return (min,max,sum)
}
let statistics = calculateStatistics(scores:[5,3,100,3,9])
print(statistics.sum)
print(statistics.2)

函数也可以有可变数量的参数,将这个参数看成是一个数组。

func sumOf(numbers:Int...) -> Int {
     var sum = 0
     for number in numbers {
          sum += number
     }
     return sum
}
sumOf()
sumOf(42,597,12)

函数可以被嵌套。里面的嵌套函数可以访问外面函数的变量。你可以在一个函数中使用嵌套函数是这个函数变得更长更复杂。

func returnFifteen() -> Int {
       var y = 10
       func add() {
             y += 5
       }
       add()
       return y
}
returnFifteen()

函数是一个引用类型,就是说一个函数可以返回另一个函数作为返回值。

func makeIncrementer() -> ( (Int) -> Int ) {//(Int) -> Int 表示返回函数的参数类型和返回类型
         func addOne(number:Int) ->Int {
                 return 1+number
        }
        return addOne
}
var increment = makeIncrementer() // 返回的是addOne函数
increment(7) 

一个函数也可以用其他函数作为参数。

func hasAnyMatches(list: [Int],condition:(Int)->Bool) -> Bool {
         for item in list {
               if condition(item) {
                     return true
               }
         }
         
         return false
}

func lessThanTen(number:Int) -> Bool {
        return number < 10
}
var number = [20, 19, 7, 12]
hasAnyMatches(number,condition:lessThanTen)//只要number数组有一个元素小于10就返回true

当条件不同时只要传入不同的函数就可以了,这样可以节省代码实施的空间。

函数其实是一种特殊的闭包:能够稍后调用的代码块。运行时闭包中的代码可以访问闭包范围内甚至不在闭包体内的变量和函数,例如嵌套函数。你可以写一个没有名字只有大括号的闭包。在闭包体内使用in去分离参数和返回值。

numbers.map({
       (number: Int) -> Int in
       let result = 3 * number
       return result
})

你已经有几种方式可以更自如的写闭包。当一个闭包类型已经知道,比如是一个代理的回调,你可以去除参数类型、返回类型或者两个都去除。单个语句闭包会把它语句的值当做结果返回。

let mappedNumbers = numbers.map ({ number in 
            3 * number
 })

print (mappedNumbers)

你可以通过参数位置访问-这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。当一个闭包是传给函数的唯一参数,你可以完全忽略括号。

let sortedNumbers = numbers.sorted {$0 > $1}
print(sortedNumbers)

声明一个闭包变量,作为参数传入一个函数中

var myBlock:(String)->() = {
      name in
      print(name)
}

func myFunction(name:String,condition:(String)->()){
        condition(name)
}

myFunction("Jason",myBlock)

其实是跟函数作为参数传入一个函数中的道理一样

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

推荐阅读更多精彩内容