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    } 

 

 

你可能感兴趣的:(swift)