Swift学习2---函数和闭包

函数

  Swift使用func关键字声明函数:

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

  通过元组(Tuple)返回多个值:

func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()

  支持带有变长参数的函数,用一个数组来获取它们:

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) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
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 numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
 闭包

  本质来说,函数是特殊的闭包,Swift中可以利用{}声明匿名闭包:

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

  如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。 

numbers.map({ number in 3 * number })

  你可以通过参数位置而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。 当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。 

sort([1,5,3,12,2]){$0>$1}

   闭包其实是 Swift 的一种类型,写作()->(),那么他就可以当做 func 的参数嵌套了。写成这样:

140    func exec(repeat: Int, block:()->()) 
141    { 
142      for i in 1...repeat{ 
143          block() 
144      } 
145    } 
146      
147    exec(10, {println("Hello World")}) 

  Swift 还提出了一个特殊的词汇:Trailing Closures,他的意思是:如果闭包是func的最后一个传参,那么他可以写在外面。如下:

148    func exec(repeat: Int, block:()->()) 
149    { 
150        for i in 1...repeat{ 
151            block() 
152        } 
153    } 
154      
155    exec(10){ 
156        println("Hello World") 
157    } 
 
原文地址:https://www.cnblogs.com/ShawnLi/p/4502067.html