编程语言
912
使用 func
来声明一个函数,使用名字和参数来调用函数。使用 ->
来指定函数返回值的类型。
funcgreet(person: String, day: String) ->String { return"Hello \(person), today is \(day)." } greet(person:"Bob", day:"Tuesday")
练习
删除
day
参数,在这个欢迎语中添加一个参数来表示今天的特价菜。
默认情况下,函数使用它们的参数名称作为它们参数的标签,在参数名称前可以自定义参数标签,或者使用 _
表示不使用参数标签。
funcgreet(_person: String, onday: String) ->String { return"Hello \(person), today is \(day)." } greet("John", on:"Wednesday")
使用元组来生成复合值,比如让一个函数返回多个值。该元组的元素可以用名称或数字来获取。
funccalculateStatistics(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 } elseif 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)
函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。
funcreturnFifteen() ->Int { var y =10 funcadd() { y +=5 } add() return y } returnFifteen()
函数是第一等类型,这意味着函数可以作为另一个函数的返回值。
funcmakeIncrementer() -> ((Int) ->Int) { funcaddOne(number: Int) ->Int { return1+ number } return addOne } var increment =makeIncrementer() increment(7)
函数也可以当做参数传入另一个函数。
funchasAnyMatches(list: [Int], condition: (Int) ->Bool) ->Bool { for item in list { ifcondition(item) { returntrue } } returnfalse } funclessThanTen(number: Int) ->Bool { return number <10 } var numbers = [20, 19, 7, 12] hasAnyMatches(list: numbers, condition: lessThanTen)
函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。闭包中的代码能访问闭包作用域中的变量和函数,即使闭包是在一个不同的作用域被执行的——你已经在嵌套函数的例子中看过了。你可以使用 {}
来创建一个匿名闭包。使用 in
将参数和返回值类型的声明与闭包函数体进行分离。
numbers.map({ (number:Int) ->Intin let result =3* number return result })
练习
重写闭包,对所有奇数返回 0。
有很多种创建更简洁的闭包的方法。如果一个闭包的类型已知,比如作为一个代理的回调,你可以忽略参数,返回值,甚至两个都忽略。单个语句闭包会把它语句的值当做结果返回。
let mappedNumbers = numbers.map({ number in3* number }) print(mappedNumbers)
你可以通过参数位置而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在圆括号后面。当一个闭包是传给函数的唯一参数,你可以完全忽略圆括号。
let sortedNumbers = numbers.sorted { $0 > $1 } print(sortedNumbers)