zoukankan      html  css  js  c++  java
  • 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    } 
     
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/ShawnLi/p/4502067.html
Copyright © 2011-2022 走看看