swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用。跟C 和 Objective-C 中的代码块(blocks)非常相似 。这个大家必须掌握!必须掌握!

必须掌握。重要的事情要说三遍

闭包能够捕获和存储其所在上下文中随意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。以下我们就来攻克它!

1、闭包函数

官方在解说闭包函数的时候一般都是使用一个sort() 的排序方法。我们来看看这个样例:

<pre name="code" class="html"><span style="font-size:18px;">let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) Bool {
return s1 > s2
}
</span>



这里我们定义了一个String 类型的数组,然后定义了一个function。接受两个 接收两个String 类型的參数。返回bool

然后我们来了解下sort() 我们这里对这个数组进行排序 依照我们定义的方法的规则,

var reversed = names.sort(backwards)

这个sort() 在swift 2.0增加数组,成为数组的成员方法能够直接调用 ,这里传入与数组类型同样的两个值 ,并返回bool 。假设返回true 就把第一个參数放在第二个前面 (也就是降序),反之你懂的

所以 。我们这个函数的意思就是假设第一个比第二个參数大就返回true(s1>s2) ,所以是一个降序的排列 ,这里得到的结果是 :[Ewa, Daniella, Chris, Barry, Alex]

大家看着官方的sort() 也看不到详细的实现,所以这块有可能不是非常清楚 ,那么我们自己写一个排序 ,也传入我们这个函数。

<span style="font-size:18px;">
func mySort (var arr:[String] , sortStr:(String,String)->Bool)->[String]
{
if(arr.count == 0){ return arr; } let count = arr.count
var temp = "" for i in 0..<count
{
for j in i+1..<count
{
if(!sortStr(arr[i],arr[j]))
{
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
return arr;
}
</span>

这事实上就是一个简单的冒泡排序 。仅仅只是把规则交给调用者 。

调用方法 mySort(names, sortStr: backwards) 这里传入的是一个数组和一个函数类型 。得到结果 :[Ewa, Daniella, Chris, Barry, Alex] 跟官方的sort一样的 。

以下的实例我们就用自己的sort 来讲,代码都在这里。

大家能够看得明确 。

这里须要补充一个知识点。

<span style="font-size:18px;">区间运算 :0...n  表示0-n的闭合区间  0..<n 表示一个包括0 不包括n半开半闭</span><span style="font-size:18px;"><a target=_blank target="_blank" name="t2">
</a>2、闭包表达式语法</span>

然而这是一个相当冗长的方式,本质上仅仅是写了一个单表达式函数 (a > b),可是我们还要写一个函数 ? 当然不须要,以下我们用闭合表达式语法能够更好的构造一个内联排序闭包

<span style="font-size:18px;">闭包表达式语法有例如以下一般形式:
{ (parameters) -> returnType in
statements
}
</span>

闭包表达式语法能够使用常量、变量和inout类型作为參数。不提供默认值。

也能够在參数列表的最后使用可变參数。 元组也能够作为參数和返回值。

<span style="font-size:18px;">let arr1 = mySort( (names) , sortStr: { (s1:String,s2:String) -> Bool in
return s1>s2
})
</span>

这里我们把上面传入函数的地方,我们传入了一个闭包。这里就不做过多解释。

全然依照上面的语法类型

  • 依据上下文判断类型

由于我们写的mySort 第二个參数是类型为(String, String) -> Bool的函数,因此实际上String,String和Bool类型并不须要作为闭包表达式定义中的一部分。 由于全部的类型都能够被正确判断,返回箭头 (->) 和环绕在參数周围的括号也能够被省略:

所以我们的能够这样写 :

<span style="font-size:18px;">let arr2 = mySort( (names) , sortStr: { s1,s2 in return s1>s2 })</span>

看到没,智能的swift帮我们把闭包缩短了非常多

  • 单表达式闭包隐式返回

单行表达式闭包能够通过隐藏returnkeyword来隐式返回单行表达式的结果。我们这里是单行表达式 。

注:不要方便的用惯了多行表达式别也给省略了

<span style="font-size:18px;">let arr3 = mySort( (names) , sortStr: { s1,s2 in s1>s2 })</span>

Swift之闭包的更多相关文章

  1. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  2. Swift:闭包

    一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Ar ...

  3. Swift学习--闭包的简单使用(三)

    一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿 ...

  4. iOS - Swift Closure 闭包

    1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...

  5. Swift使用闭包表达式

    Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in    语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是 ...

  6. Swift的闭包(一):闭包简介、闭包表达式的优化

    定义:Closures are self-contained blocks of functionality that can be passed around and used in your co ...

  7. swift 深入理解Swift的闭包

    我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: ...

  8. Swift逃逸闭包之见解

    Swift 逃匿闭包顾名思义,就是闭包想要逃跑.当闭包作为参数传给一个方法时,在这个方法被调用完后闭包却还没有被执行,而是等到方法执行完后才调用 基本都是跨线程的时候才会有逃逸闭包这个说法.因为异步 ...

  9. Swift:闭包(Closures)

    一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...

随机推荐

  1. 高效程序员的45个习惯·敏捷开发修炼之道(Practices of an Agile Developer)读书笔记

    首先,这本书值得再看一遍——这次的阅读,有很多东西都是知其“形”,不知其“神”的,这导致了我对其中某些建议持怀疑态度,接受了的建议也有待商榷. 总之,先记录本书的一些信息: Practices of ...

  2. Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas)

    Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas) 如果还没有本地安装Python.IPython.notebook等请移步 上篇Py ...

  3. git 删除分支如何恢复

    强制删除了一个分支而后又想重新使用这个分支,该怎么找回该分支上的代码呢? 一:问题描述: 今天师父说上线几个功能,让我把开发的分支推送到远程.当打开git就傻眼了,之前开发好的分支被我删除了,就连推送 ...

  4. JSP学习笔记 - 内置对象 Response

    1.response.addHeader("refresh","2"): 制定页面刷新时间 2.response.addHeader("refresh ...

  5. 关于ajax跨域解读

    首先要了解何为跨域,(协议.域名.端口任意一个不同)的web资源.如何解决跨域:1,jsonp 它只支持GET请求而不支持POST等其它类型的HTTP请求:例如angular 中,如下使用,$http ...

  6. win10 ubuntu 子系统安装php

    apt-get install python-software-propertiesadd-apt-repository ppa:ondrej/phpapt-get updateapt-get ins ...

  7. display math in cnblog

    $a=b+c$ this is a example \(a=\frac{b}{c}\)

  8. Vuex实践小记

    1.目录结构 2.开始(安装vuex) npm install vuex --save 3.编辑store/index.js(创建一个Vuex.store状态管理对象) import Vue from ...

  9. react入门----组件的基础用法

    1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...

  10. visioStudio常见问题

    问题一: 在做项目时候,使用VisioStudio 2008,一不小心将设置恢复到了原始,一直找不到需要的东西. 比如生成方式“debug”和“Release”选择框没有.一些图标也没有. 经过不断的 ...