首页 > 其他分享 >Swift开篇005->闭包

Swift开篇005->闭包

时间:2023-02-01 12:33:38浏览次数:52  
标签:闭包 sort String 005 var Swift 表达式 reverse


PART_A 背景

  1. 闭包的概念:自包含的函数代码块,可以在代码中被传递和使用. 用简洁语法构建内联闭包
  2. 闭包的三种形式
  • 全局函数是一个有名字但不会捕获任何值的闭包
  • 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
  • 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
  1. Swift对闭包的优化
  • 利用上下文推断参数和返回值类型
  • 隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
  • 参数名称缩写
  • 尾随(Trailing)闭包语法

PART_B 闭包表达式

  1. 一般格式
{ (parameters) -> returnType in
statements
}
  1. 通过对 sort() 的优化展示闭包表达式
  1. 一般方式
// 定义字符串数组
let names = ["zhangsan", "lisi", "wanger", "zhaoritian"]

// 定义排序规则(按字典降序)
func compare(str1: String, str2: String) -> Bool {
return str1 > str2
}

// 通过sort方法传入规则进行排序
func test() {
var reverse = names.sort(compare)
print(reverse) // ["zhangsan", "zhaoritian", "wanger", "lisi"]
}
  1. 利用闭包表达式构建内联排序闭包
  • 闭包表达式:可以使用常量、变量和inout类型作为参数,不能提供默认值
  • 可以在参数列表的最后使用可变参数
  • 元组也可以作为参数和返回值
// compare方法替换成闭包表达式:{ ... }
// 圆括号包裹了方法的整个参数,即内联闭包
var reverse = names.sort({
(str1: String, str2: String) -> Bool in
return str1 > str2
})
  1. 简写:根据上下文推断类型(闭包作为函数或方法的参数时都可省略类型)
  • 该排序闭包函数是作为 sort() 的参数传入,则自动推断参数和返回值类型:​(String, String) -> Bool​
var reverse = names.sort({ str1, str2 in return str1 > str2 })
  1. 单表达式闭包隐式返回
  • 可省略 return 来隐式返回单行表达式的结果
var reverse = names.sort({ str1, str2 in str1 > str2 })
  1. 参数名称缩写
  • 可直接通过 $0​$1​…来顺序调用闭包的参数
var reverse = names.sort({ $0 > $1 })
  1. 运算符函数
  • Swift的 String 类型定义了大于号的字符串实现:即作为函数接收两个 ​String​ 参数并返回 ​Bool​
var reverse = names.sort(>)

PART_C 尾随闭包:闭包很长时建议使用

  1. 格式
  • 未使用尾随闭包进行函数调用
func({
// 闭包主体
})
  • 使用尾随闭包进行函数调用
func() {
// 闭包主体
}

// 或者如下写法:见举例的注释
func {
// 闭包主体
}
  • 举例:PART_A中第5条可写成如下
var reverse = names.sort() { $0 > $1 }

// 若函数只需闭包表达式一个参数,使用尾随闭包时,可省略()
var reverse = names.sort { $0 > $1 }
  1. 例子:map()
  • 重点内容
// 数字数组
let digitNum = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "four", 5: "Five",
6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]

// 匹配数字顺序
let nums = [16, 58, 510, 3418, 1]

func test() {
// 闭包表达式(长)
let strs = nums.map {
// 类型
(var num) -> String in
var output = ""
while num > 0 {
// 字典下标 digitNum 返回可选值
output = digitNum[num % 10]! + output
num /= 10
}
return output
}
}
// OneSix
// FiveEight
// FiveOneZero
// ThreefourOneEight
// One


标签:闭包,sort,String,005,var,Swift,表达式,reverse
From: https://blog.51cto.com/u_15950249/6031348

相关文章

  • Swift开篇003->控制流、函数
    PART_A控制流​​for​​​​for...in​​forindexin1...5{print(index)}letnames=["cat","dog","fish"]fornameinnames{print(name)}letnums=......
  • Swift开篇001->新建Swift工程
    最近看了点​​Swift的教程​​,在此做个笔记,那就从Xcode新建一个Swift工程开始吧​​File->New->Project​​​​OSX->Application->CommandLineTool​​​​填......
  • Swift开篇002->基本运算符
    PART_A运算符赋值运算符:​​=​​普通赋值varnumnum=5元组赋值let(x,y)=(0,0)​​=​​操作不返回任何值算数、组合赋值、自增自减、、负号、字符串拼接求余时符号......
  • 【算法训练营day34】LeetCode1005. K次取反后最大化的数组和 LeetCode134. 加油站 Lee
    LeetCode1005.K次取反后最大化的数组和题目链接:1005.K次取反后最大化的数组和独上高楼,望尽天涯路思路对了,代码也ac了,但是代码太臃肿了。classSolution{private:......
  • OutputDebugString在X64出现异常 0xC0000005
    xxxxx.exe中的0x78ebb746处最可能的异常:0xC0000005:读取位置0xffffffffffffffff时发生访问冲突对应位置指令0000000078EBB7460FAE8100010000fxsave......
  • go闭包和传参的区别
    问题:为啥包一层输出的就有问题了funcmain(){ arr:=[]int{1,2,3} for_,v:=rangearr{ gofunc(){ println(v) }() }//333 time.Sleep(time.S......
  • C# 闭包类对弱引用的坑
    闭包、弱引用的简单概念,大佬们描述的很多,我引用下:理解C#中的闭包-黑洞视界-博客园(cnblogs.com)C#弱引用(WeakReference)-简书(jianshu.com)组里小伙伴报了个......
  • 闭包
    1.闭包(closure)指有权访问另一个函数作用域中变量的函数一个函数作用域可以访问另一个函数局部变量,延长变量的作用范围//1.闭包(closure)指有权访问另一个函数作用域中变......
  • 005 python 打开windows下的软件,python打开记事本 subprocess
    如果要用python代码打开windos上的记事本,代码如下:importsubprocessnotePro=subprocess.Popen('notepad.exe')print(notePro)如果要打开别的软件,则把notepad.exe......
  • Day16 -闭包和装饰器
    1.闭包介绍和基本语法1.函数产生嵌套(外函数中定义一个内函数)2.内函数使用外函数定的局部变量3.外函数返回内函数的引用(函数名)闭包的介绍我们前面已经学过了......