Swift系列之闭包(Closure)

现在随着Swift的开源,许多开发者也更加倾向于Swift,随着Swift的排名不断上升们也许不久之后就会取代OC的位置,Swift是集众多语言之长,也许刚开始接触觉得语法怪异,当年学OC时不也一样觉得OC语法很纠结。

下面就来了解一下,Swift中的闭包(Closure) ,闭包的地位等同于OC中的Block,当然他们之间的用法也很类似!

闭包格式

Swift中的闭包表达式灵活,其标准语法格式如下:

{    
    (参数列表) ->返回值类型 in

    语句组
}

其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。

下面我们来写一个简单的闭包(Closure),类比于OC的Block,当时的Block必须要有定义,声明和实现,先来简单回顾一下吧。 如下:

这里写图片描述

一个简单的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)简化写法

Swift提供了多种闭包简化写法,我来介绍下面几种不同形式:

// 形式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: 省略关键字return
sumClosure = {
    $0 + $1
}

闭包(Closure)重定义

说到这里,大家是不是想到了 typedef 这个关键字了,但是在Swift中,换成 typealias ,当然作用是一样的。

// 有参数无返回值的
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)传值

这里以两个界面之间传值为例,在第一个界面设置一个UILable,将第二个界面UITextField中的值传到UILable上,原理和使用Block进行界面传值是一样的,下面直接上代码:
使用storyBoard直接拖得控件
第一个界面 :ViewController.swift

import UIKit

class 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 = {
            (str: String) ->Void in
            self.label.text = str
        }
        self.navigationController?.pushViewController(AVC, animated: true)
    }
}

第二个界面 :AViewController.swift

import UIKit

class 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)
    }

}

先到这里吧,大家相互学习,不足还望指出!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值