• 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    } 
     
  • 相关阅读:
    PostgreSQL Replication之第四章 设置异步复制(4)
    PostgreSQL Replication之第四章 设置异步复制(3)
    PostgreSQL Replication之第四章 设置异步复制(2)
    PostgreSQL Replication之第四章 设置异步复制(1)
    PostgreSQL Replication之第三章 理解即时恢复(4)
    Hdu3065 病毒侵袭持续中
    poj3974 Palindrome
    poj1204 Word Puzzles
    Hdu2222 Keywords Search
    Codeforce 633.C Spy Syndrome 2
  • 原文地址:https://www.cnblogs.com/ShawnLi/p/4502067.html
Copyright © 2020-2023  润新知