美文网首页iOS-swift
Swift 闭包表达式

Swift 闭包表达式

作者: huiyuM | 来源:发表于2016-12-29 15:10 被阅读37次

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

 { (parameters) -> returnType in
     statements
 }

闭包表达式参数 可以是 in-out 参数,但不能设定默认值。也可以使用具名的可变参数(但是如果可变参数不放在参数列表的最后一位的话,调用闭包的时时编译器将报错。)

  • 举个例子
var names = ["Jack", "Bob", "Tom", "Alen", "James",]
 var sortedArray = names.sorted(by: { (s1: String, s2: String) -> Bool in 
      return s1 > s2
})

闭包的函数体部分由关键字 in 引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

简化之旅

  1. 根据上下文推断类型
    因为排序闭包函数是作为 sorted(by:) 方法的参数传入的,Swift 可以推断其参数和返回值的类型。 sorted(by:) 方法被一个字符串数组调用,因此其参数必须是 (String, String) -> Bool 类型的函数。这意味着 (String, String) 和 Bool 类型并不需要作为闭包表达式定义的一部分。因为所有的类型都可以被正确推断,返回箭头( -> )和围绕在参数周围的括号也可以被省略:
    reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

  2. 单表达式闭包隐式返回
    单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为:
    reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

sorted(by:) 方法的参数类型明确了闭包必须返回一个 Bool 类型值。因为闭包函数体只包含了一个单一表达式( s1 > s2 ),该表达式返回 Bool 类型值,因此这里没有歧义, return 关键字可以省略。

  1. 参数名称缩写
    Swift 自动为内联闭包提供了参数名称缩写功能,你可以直接通过 $0 , $1 , $2 来顺序调用闭包的参数,以此类推。
    如果你在闭包表达式中使用参数名称缩写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
    reversedNames = names.sorted(by: { $0 > $1 } )
    在里的$0$1表示闭包中第一个和第二个 String 类型的参数。

  2. 运算符方法
    其实还有一种更简短的方式来编写上面例子中的闭包表达式。Swift 的 String 类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个 String 类型的参数并返回 Bool 类型的值。而这正好与
    sorted(by:) 方法的参数需要的函数类型相符合。因此,你可以简单地传递一个大于号,Swift 可以自动推断出你想使用大于号的字符串函数实现:
    reversedNames = names.sorted(by: >)

相关文章

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • swift 闭包与闭包表达式

    闭包与闭包表达式 在swift里闭包大家都很熟悉,相当于oc中的block。闭包表达式又是啥?很多人把闭包表达式等...

  • Swift学习笔记(1)

    SWift学习笔记 闭包 闭包表达式 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 ...

  • Swift语法 -- [07 - 闭包]

    在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 1 闭包表达式 闭包表达式 闭包表...

  • Swift 5基础语法要点整理—闭包

    闭包 闭包表达式 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 闭包表达式的简写...

  • Swift-闭包

    闭包表达式 在swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 闭包表达式简写 尾随闭...

  • 闭包

    闭包 本节内容包括: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 Swift 中的闭包与 C 和 Objecti...

  • 第六节 闭包表达式与闭包

    一. 闭包表达式 1. 闭包表达式 在swift中可以通过 func 定义一个函数,也可以通过闭包表达式定义一个函...

  • 闭包

    闭包表达式 在swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 闭包表达式的简写 尾随...

  • Swift--闭包

    闭包表达式 在Swift中,可以通过 func定义一个函数,也可以通过闭包表达式定义一个函数 闭包表达式的简写 尾...

网友评论

    本文标题:Swift 闭包表达式

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