swift中闭包的学习。

  在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用。

  闭包定义:    

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

// 多条swift语句

    // 执行代码  insert coding

}

  实际创建闭包代码如下:

1 var square = {(value1 value1:Int,value2 value2:Int)->Int in
2     // 代码块
3     if value1>value2{
4         return value1
5     }
6     return value2
7
8 }

  注释: 1.此处我们定义一个 square的变量,该变量的类型可以通过闭包的返回值类型进行推导,通过代码得出square的类型为(Int,Int)->Int类型。

      2.这段闭包代码的意义是 比较两个数的大小,将最大的那个数返回,并赋值给square

      3. 注意闭包中的参数名,如果不定义外部参数名,当我们调用的时候是不会有任何的提示(xcode 7.2,也许版本高了之后会有改进吧,毕竟现在xcode在写swift很多提示都不给出),如果我们给两个参数提供外部名时,当我们调用这个闭包的时候系统会给出提示。

  调用闭包代码如下:

  

var max = square(value1: 3, value2: 5)
print(max)

    一个完整的闭包表达式是需要定义 形参类型,返回值类型,但是由于在swift中可以根据上下文进行推导参数类型,所以当变量确定类型时,闭包中的新参类型和返回值类型可以省略:

1 var square1:(Int,Int)->Int = {(value1,value2) in  (value1 > value2 ? value1 : value2)
2 }

  注释:1.这段代码初学者可能看着比较费劲,可能不理解(Int,Int)->Int 是什么,它其实就是一个类型,是闭包的类型,这段代码实则就是将闭包中的类型全部写到了变量类型定义处了。初学者在练习的时候可以按照规范进行编写,等熟练的时候可以看这段代码,现在只是作为了解。

     2.另外,可以看到 此处的返回值省略了return ,当代码执行体有且只有一行代码的时候,可以将其省略。

     3.还可以省略形参名,如果闭包表达式省略了形参名 那么 in 关键值也是可以省略的。此时闭包表达式用 $0 $1 $2...名字来一用第一个、第二个、第三个形参。

  闭包可以捕获上下文中的常量和变量

    闭包可以访问或修改其所在的上下文中的变量或常量(常量只可以访问,不可以修改),这个过程称之为捕获。即便定义的这些变量或常量的作用域已经不存在了,但是闭包依然可以访问或修改它们。

  程序如下

 1 // 定义一个函数,该函数的返回值类型为:()->[String]
 2 func makeArray(ele:String)->()->[String]
 3 {
 4     // 定义一个数组,该数组不包含任何元素
 5     var arr:[String] = []
 6     // 定义一个嵌套方法,该方法返回一个String数组
 7     func addElement()->[String]
 8     {
 9         // 在arr数组中添加一个ele的元素
10         arr.append(ele)
11         return arr
12     }
13
14     return addElement
15
16 }

  注释:由上面程序可以看出在arrElement()中没有定义任何的参数和变量,但是依然可以访问到arr 和 ele 这是因为它通过上下文捕获到在其所在上下文存在这两个变量或参数,所以arrElement()在没有定义的情况下可以取到.

时间: 2024-11-07 02:44:17

swift中闭包的学习。的相关文章

swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义 #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 {     // 使用?的好处 就是一旦 self 被释

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel

swift中闭包和OC的block的对比

// //  ViewController.swift //  swift的函数和闭包 // //  Created by Ninesday on 16/6/23. //  Copyright © 2016年 Ninesday. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do a

Swift中Switch的学习

switch的简单使用: 相比 C 和 objective - C 中的 switch 语句,Swift 中的 switch 语句不会默认的掉落到每个 case 的下面进入 另一个 case.相反,第一个匹配的 switch 语句当第一个匹配的 case 一完成, 就完成了它整个的执行.而不需 要一个明确的 break 语句.这使得 switch 语句比在 C 语言中使用更安全.更简单,并避免错误地执行多个 case. 从例子学习: let anotherCharacter :Character

lua语言中闭包的学习心得

lua语言有如下两个特点: 1.lua中的函数可以被存放在变量.表中,也可以作为函数的参数,还可以作为函数的返回值,如: func = function() print("Hello"); end 等价于 function func() print("Hello"); end 这两种写法都是函数func()的定义:并且下面这个例子: function func() return function() print("Hello"); end --函

swift中闭包的使用(类似与block的做法) 闭包传值

需要闭包的类 import UIKit //定义闭包类型(特定的函数类型函数类型) typealias InputClosureType = (String) -> Void protocol SecondViewControllerDelegate: NSObjectProtocol{ func fetchBackString(str: String) } class SecondViewController: UIViewController { @IBOutlet weak var inp

[Swift]UIAlertController 以及 Swift 中的闭包和枚举

原文地址:http://blog.callmewhy.com/2014/10/08/uialertcontroller-swift-closures-enum/ 在 iOS8 的 SDK 中, UIKit 框架里两个经常使用的 API 有了比較大的修改.UIActionSheet 和 UIAlertView 都被 UIAlertController 替换了. 在 iOS8 里,假设你想要弹出消息,你应该使用 UIAlertController 而不是那两个不建议使用的类了. ActionShee

Swift 中的利刃,函数和闭包

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

Swift:闭包(Closures)

一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, javascript中的函数嵌套等类似. 闭包能够捕获和存储上下文中定义的的不论什么常量和变量的引用. 这就是所谓的变量和变量的自封闭, 因此闭包还会处理全部捕获的引用的内存管理. 全局函数和嵌套函数事实上就是特殊的闭包. 闭包的形式有: (1)全局函数都是闭包.有名字但不能捕获不论什么值. (2)嵌套函数