美文网首页Swift
Swift Closures Tips

Swift Closures Tips

作者: KeymyLin | 来源:发表于2017-02-15 17:45 被阅读0次

    闭包表达式语法的一般形式:

    { (parameters) -> returnType in
        statements
    }```
    
    ####根据上下文推断类型
    通过内联闭包表达式构造的闭包作为参数传递给函数或方法时,总是能够推断出闭包的参数和返回值类型。这意味着闭包作为函数或者方法的参数时,你几乎不需要利用完整格式构造内联闭包。
    ####单表达式闭包隐式返回
    

    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

    #####参数名称缩写
    

    reversedNames = names.sorted(by: { $0 > $1 } )

    #####闭包是引用类型
    无论你将函数或闭包赋值给一个常量还是变量,你实际上都是将常量或变量的值设置为对应函数或闭包的引用。
    

    var myClosure = oneClosure
    let thisClosure = twoClosure

    #####自动闭包
    自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。
    

    var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    print(customersInLine.count)
    // 打印出 "5"

    let customerProvider = { customersInLine.remove(at: 0) /* 这时不会执行*/}
    print(customersInLine.count)
    // 打印出 "5"

    print("Now serving (customerProvider())!")
    // Prints "Now serving Chris!"
    print(customersInLine.count)
    // 打印出 "4"

    // customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
    func serve(customer customerProvider: () -> String) {
    print("Now serving (customerProvider())!")
    }
    serve(customer: { customersInLine.remove(at: 0) } )
    // 打印出 "Now serving Alex!"

    使用**@autoclosure**关键字让你能够省略闭包的花括号,用一个普通的表达式来代替显式的闭包
    

    // customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
    func serve(customer customerProvider: () -> String) {
    print("Now serving (customerProvider())!")
    }
    serve(customer: { customersInLine.remove(at: 0) } )
    // 打印出 "Now serving Alex!"

    如果你想让一个自动闭包可以“逃逸”,则应该同时使用 @autoclosure 和 @escaping 属性。
    

    // customersInLine i= ["Barry", "Daniella"]
    var customerProviders: [() -> String] = []
    func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
    customerProviders.append(customerProvider)
    }
    collectCustomerProviders(customersInLine.remove(at: 0))
    collectCustomerProviders(customersInLine.remove(at: 0))

    print("Collected (customerProviders.count) closures.")
    // 打印 "Collected 2 closures."
    for customerProvider in customerProviders {
    print("Now serving (customerProvider())!")
    }
    // 打印 "Now serving Barry!"
    // 打印 "Now serving Daniella!"

    
    

    相关文章

      网友评论

        本文标题:Swift Closures Tips

        本文链接:https://www.haomeiwen.com/subject/aguqwttx.html