Swift系列之闭包(Closure)
现在随着Swift的开源,许多开发者也更加倾向于Swift,随着Swift的排名不断上升们也许不久之后就会取代OC的位置,Swift是集众多语言之长,也许刚开始接触觉得语法怪异,当年学OC时不也一样觉得OC语法很纠结。
下面就来了解一下,Swift中的闭包(Closure) ,闭包的地位等同于OC中的Block,当然他们之间的用法也很类似!
- 闭包格式
{
(参数列表) ->返回值类型 in
语句组
}
【Swift系列之闭包(Closure)】其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
下面我们来写一个简单的闭包(Closure),类比于OC的Block,当时的Block必须要有定义,声明和实现,先来简单回顾一下吧。 如下:[图片上传失败...(image-509d83-1558575292757)]
一个简单的OC中的Block写法:
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str){
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
Swift中的闭包(Closure)马上也来了:
// 声明一个闭包(有两个整形参数,且返回值为整形的闭包)
var sumClosure:((a: Int, b: Int) -> Int)// 实现闭包
sumClosure = {(a: Int, b: Int) -> Int in
return a + b
}// 调用
let sum = sumClosure(a: 10,b: 20)print(sum)
是不是类似,这样学习起来就不会觉得别扭了,怪的是语法书写,原理是相同的,学习一门语言就是这样,原理搞懂了,学起来就轻松了!
- 闭包(Closure)简化写法
// 形式1: 带有参数参数类型,参数名,返回值类型
sumClosure = { (a: Int, b: Int) -> Int in return a + b}// 形式2: 省略参数类型
sumClosure = { (a,b) -> Int in return a + b}// 形式3: 省略返回值类型
sumClosure = { (a,b) in return a + b}// 形式4:省略参数小括号
sumClosure = { a,b in return a + b}// 形式5: 省略参数
sumClosure = { return $0 + $1}// 形式6: 省略关键字
returnsumClosure = { $0 + $1}
- 闭包(Closure)重定义
// 有参数无返回值的
typealias Myclosure1 = (str:String) ->Void// 有参数无返回值的
typealias Myclosure2=(str:String) ->String// 两个参数,一个返回值
typealias Myclosure3=(str:String,str:String)->String// 无参数,无返回值
typealias Myclosure4=()->Void
使用如下:
var closure1: Myclosure1?
closure1 = { (str: String) ->Void in
print(str)
}
closure1!(str: "HelloWorld")
- ** 闭包(Closure)作为方法的参数**
// MARK: - 闭包作为方法参数
var closure4:Myclosure4?
closure4 = {
print("Swift")
} func Fun(myclosure: Myclosure4) {
myclosure()
} Fun(closure4!)
- 闭包(Closure)传值
使用storyBoard直接拖得,方便快捷。
下面是示例代码:
第一个界面 :ViewController.swift
import UIKitclass ViewController: UIViewController {
@IBOutlet weak var label: UILabel!override func viewDidLoad() {
super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.
}
func setupClosures(str: String) -> Void {
label.text = str
}
@IBAction func next(sender: UIButton) {
let AVC: AViewController = UIStoryboard.init(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("AVC") as! AViewController// AVC.myclosures = setupClosures
AVC.myclosures = {[unowned self] (str: String) ->Void in
self.label.text = str
}
self.navigationController?.pushViewController(AVC, animated: true)
}}
第二个界面 :AViewController.swift
import UIKitclass AViewController: UIViewController {
typealias closures = (text: String) -> Void
@IBOutlet weak var textField: UITextField!
var myclosures: closures?override func viewDidLoad() {
super.viewDidLoad() // Do any additional setup after loading the view.}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.
}@IBAction func previous(sender: UIButton) {
if (myclosures != nil) {
myclosures?(text:textField.text!)
}
self.navigationController?.popViewControllerAnimated(true)
}}
先到这里吧,大家相互学习,不足还望指出!
推荐阅读
- 【欢喜是你·三宅系列①】⑶
- 你不可不知的真相系列之科学
- 人脸识别|【人脸识别系列】| 实现自动化妆
- Swift中willSet和didSet的简述
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- 2018-06-13金句系列7(金句结构-改编古现代诗词)
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 乡野村趣系列之烧仙草
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)