Swift简明教程(三)-函数与闭包

Swift简明教程(三)-函数与闭包

Swift使用func关键字定义函数,然后与C语言一样使用函数名进行调用,而函数返回值类型用->标示。

<code class="lua hljs" data-origin="" 
func greet(name: String, day: String) -&gt; String {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

<code class="lua hljs" data-origin=""

试验
移除day参数,添加一些别的信息

<code class="lua hljs" data-origin=""

使用元组从函数中返回多个值。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func getGasPrices() -&gt; (Double, Double, Double) {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
Swift的函数可以接受可变参数。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func sumOf(numbers: Int...) -&gt; Int {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }

    return sum
}
sumOf()
sumOf(43, 597, 12)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
试验
编写一个计算参数平均值的函数

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
Swift的函数可以进行嵌套。被嵌套的函数可以访问外面函数定义的变量。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func returnFifteen() -&gt; Int {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}

returnFifteen()

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
Swift中的函数也是基本的数据类型,也就是说可以在一个函数中返回另外一个函数。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func makeIncrementer() -&gt; (Int -&gt; Int) {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }

    return addOne
}

var increment = makeIncrementer()
increment(7)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
函数当然也可以作为其它函数的参数进行传递。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func hasAnyMatches(list: Int[], condition: Int -&gt; Bool) -&gt; Bool {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">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 numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
实际上Swift中的函数是闭包的一个特例。我们可以使用没有名字的{}来定义闭包,而闭包内容与返回值类型之间用in进行分隔。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
numbers.map({" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">numbers.map({
    (number: Int) -> Int in
        let result = 3 * number
        return result
})

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
试验
重写上面的闭包,使得所有的奇数都返回0

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
还有几种方式可以使得闭包的编写更加简洁。当闭包的类型是已知的,比如作为回调或者代理的时候,你可以省略参数类型或者返回值类型。如下:

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
numbers.map({ number in 3 * number })" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">numbers.map({ number in 3 * number })

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
在闭包中还可以使用位置来引用参数,这在编写非常短的闭包的时候比较有用。当闭包作为函数的最后一个参数时,可以将它放在函数的圆括号后面。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
sort([1, 5, 3, 12, 2]){ $0 &gt; $1 }" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">sort([1, 5, 3, 12, 2]){ $0 > $1 }
<code class="lua hljs" data-origin=""
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值