Swift - Closures(闭包)

Swift - Closures(闭包) 首页 / Swift入门教程 / Swift - Closures(闭包)

Swift 4中的闭包类似于以块形式组织的自包含函数的闭包,并在诸如C和Objective C语言的任何地方调用。在函数内部定义的常量和变量引用被捕获并存储在闭包中。

以下是定义闭包的通用语法,闭包接受参数并返回数据类型-

{
   (parameters) -> return type in
   statements
}

以下是一个简单的示例-

let studname={ print("Welcome to Swift Closures") }
studname()

运行上述程序时,我们得到以下输出-

Welcome to Swift Closures

以下闭包接受两个参数并返回Bool值-

{     
   (Int, Int) -> Bool in
   Statement1
   Statement 2
   ---
   Statement n
}

以下是一个简单的示例-

let divide={
   (val1: Int, val2: Int) -> Int in 
   return val1/val2 
}

let result=divide(200, 20)
print (result)

运行上述程序时,我们得到以下输出-

10

升序排序

通过标准库中已提供的Swift 4保留函数" sorted"实现对字符串进行排序,函数将给定的字符串按升序排序,并以与旧数组中提到的大小和数据类型相同的新数组返回元素,旧数组保持不变。

func ascend(s1: String, s2: String) -> Bool {
   return s1 > s2
}

let stringcmp=ascend(s1: "Swift 4", s2: "great")
print (stringcmp)

运行上述程序时,我们得到以下输出-

true

闭包表达式不支持默认值。可变参数和元组也可用作参数类型和返回类型。

let sum={
   (no1: Int, no2: Int) -> Int in 
   return no1 + no2 
}

let digits=sum(10, 20)
print(digits)

运行上述程序时,我们得到以下输出-

30

函数语句中提到的参数和返回类型声明也可以由带有'in'关键字的内联闭包表达式函数表示。声明参数和返回类型后," in"关键字用于表示闭包的主体。

隐式返回

在这里,排序函数的第二个参数的函数类型清楚地表明,闭包必须返回Bool值。因为闭包的主体包含返回Bool值的单个表达式(s1> s2),所以没有歧义,可以省略return关键字。

要在表达式闭包中返回Single Expression语句,在其声明部分省略了'return'关键字。

var count:[Int]=[5, 10, -6, 75, 20]
let descending=count.sorted(by: { n1, n2 in n1 > n2 })
let ascending=count.sorted(by: { n1, n2 in n1 < n2 })

print(descending)
print(ascending)

运行上述程序时,我们得到以下输出-

[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]

该语句本身明确定义了,当string1大于字符串2时,返回true,否则返回false,因此在这里省略return语句。

已知类型闭包

考虑两个数字的加法。我们知道加法将返回整数数据类型。因此,已知的类型闭包被声明为-

let sub={
   (no1: Int, no2: Int) -> Int in 
   return no1 - no2 
}

let digits=sub(10, 20)
print(digits)

运行上述程序时,我们得到以下输出-

-10

闭包参数

Swift 4自动为内联闭包提供了缩写参数名称,可用于通过名称$0,$1,$2等来引用闭包参数的值。

var shorthand: (String, String) -> String
shorthand={ $1 }
print(shorthand("100", "200"))

在这里,$0和$1引用闭包的第一个和第二个String参数。

运行上述程序时,我们得到以下输出-

200

Swift 4通过表示$0,$1,$2- $n来帮助用户将内联闭包表示为速记参数名称。

无涯教程网

闭包函数

Swift 4仅提供操作员函数作为闭包,从而提供了一种访问成员的简便方法。关键字" Bool"用于在字符串相等时返回 true,否则返回false。

闭包中的运算符函数使表达式变得更加简单-

let numb=[98, -20, -30, 42, 18, 35]
var sortedNumbers=numb.sorted ({
   (left: Int, right: Int) -> Bool in
   return left < right
})

let asc=numb.sorted(<)
print(asc)

运行上述程序时,我们得到以下输出-

[-30, -20, 18, 35, 42, 98]

Trailers闭包

借助"Trailing Closures"来声明将函数的最终参数传递给闭包表达式,它用{}写入函数()的外部,如果无法在一行中内联编写函数,则需要使用它。

reversed=sorted(names) { $0 > $1}

其中{$0> $1}表示为在外部(名称)中声明的结尾闭包。

import Foundation
var letters=["North", "East", "West", "South"]

let twoletters=letters.map({ 
   (state: String) -> String in
   return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString
})

let stletters=letters.map() { 
   $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString 
}
print(stletters)

运行上述程序时,我们得到以下输出-

[NO, EA, WE, SO]

捕获值和引用类型

在Swift 4中,捕获常量和变量值是在闭包的帮助下完成的,即使变量不再存在,它也将引用和修改闭包体内那些常量和变量的值。

通过在其他函数的主体中写入function来使用嵌套函数来捕获常量和变量值。

let decrem=calcDecrement(forDecrement: 18)
decrem()

在这里, oneDecrement 和Decrement变量都将指向同一内存块作为闭包引用。

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement=100
   func decrementer() -> Int {
      overallDecrement -= total
      print(overallDecrement)
      return overallDecrement
   }
   return decrementer
}

let decrem=calcDecrement(forDecrement: 18)
decrem()
decrem()
decrem()

运行上述程序时,我们得到以下输出-

82
64
46

每次调用函数calcDecrement时,它都会调用decrementer()函数并将值减18,并在函数calcDecrement的帮助下返回输出。此处的calcDecrement充当闭包。

即使函数decrementer()没有任何自变量,默认情况下闭包也通过捕获其现有值来引用变量'overallDecrement'和'total'。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Service Mesh实践指南 -〔周晶〕

Linux性能优化实战 -〔倪朋飞〕

透视HTTP协议 -〔罗剑锋(Chrono)〕

Kafka核心源码解读 -〔胡夕〕

视觉笔记入门课 -〔高伟〕

微信小程序全栈开发实战 -〔李艺〕

人人都用得上的写作课 -〔涵柏〕

基于人因的用户体验设计课 -〔刘石〕

程序员的测试课 -〔郑晔〕

好记忆不如烂笔头。留下您的足迹吧 :)