函数和闭包 2个月前

编程语言
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)
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222909
累计阅读

热门教程文档

C#
57小节
Swift
54小节
Lua
21小节
React
18小节
Vue
25小节