天天看點

Swift學習之路 -- 函數和閉包

本文學習自《 The Swift Programming Language-swift2.0官方手冊 中文版》的電子版

是記錄自己的Swift學習曆程、整理相關資料便于檢視

函數

使用func來聲明一個函數,使用名字和參數來調用函數,使用->來指定函數傳回值的類型

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

練習:删除day參數,添加一個參數表示想要幹什麼

func intro(name:String,lunch:String) ->String {
            return "Hi \(name),I want to  \(lunch)"
        }
      intro("Unique", lunch: "sleepping")
           

使用元組來讓一個函數傳回多個值,該元組的元素可以用名稱或數字來表示

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

for score in scores {
    if score > max {
       max = score
    } else if score < min {
       min = score
    }
       sum += score
    }
    return (min,max,sum)
    }
let statis = calcu([,,,,])
print(statis.sum)
print(statis)
           

函數可以帶有個數可變的參數,在函數内表現為數組的形式

func sumOf(numbers:Int...) ->Int {
     var sum = 
     for number in numbers {
         sum += number
     }
     return sum
}
//[Int]表示該參數是數組類型 Int...表示該參數是可變參數
sumOf()
sumOf(,,)
           

練習:寫一個計算參數平均值的函數

func meanOf(numbers:Int...) ->Int {
var sum  = 
var mean = 
for number in numbers {
    um += number
    }
    mean = sum / numbers.count
    return mean
    }
meanOf(,,)
meanOf(,,)
           

函數可以嵌套,被嵌套的函數可以通路外側函數的變量,你可以使用嵌套函數來重構一個太長或者太複雜的函數

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

函數是第一等類型 也就是說函數可以作為另一個函數的傳回值

func makeIncrenebter() ->(Int ->Int) {
     func addOne(number:Int) ->Int {
          return  + number
     }
     return addOne
}
var increment = makeIncrenebter()
increment()
           

addOne作為makeIncrenebter()的傳回值

函數也可以當做參數傳入另一個函數

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 < 
}
var numbers = [,,,]
hasAnyMatches(numbers, condition: lessThanTen)
           

閉包

函數實際上是一種特殊的閉包:它是一段在之後能被調取的代碼。

閉包中的代碼能通路閉包所建作用域中能夠得到的變量和函數,即使閉包是在一個不同的作用域被執行的,在嵌套函數的例子中可以展現

可以使用{}在建立一個匿名閉包

使用in将參數和傳回值類型聲明與閉包的函數體分離開

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

有很多種建立更簡潔的閉包的方法。如果閉包的類型已知,如果作為一個回調函數,你可以忽略參數的類型和傳回值。單個語句閉包會把它語句的值當做結果傳回

let mapNumbers = numbers.map({ number in  * number})
        print(mapNumbers)
           

你也可以通過參數位置來引用參數 – 此方法在非常短的閉包中非常有用

當一個閉包作為最後一個參數傳給一個函數的時候,他可以直接跟在括号後面

當一個閉包是傳給函數的唯一參數,你可以完全忽略括号

let sortesNumbers = numbers.sort{$0 > $1}
        print(sortesNumbers)
           

繼續閱讀