文档章节

swift闭包初见

代码诱惑
 代码诱惑
发布于 2014/08/20 23:05
字数 851
阅读 13
收藏 1

闭包。。曾经在javaScript中“大显身手,霸占内存”的传奇方法,如今在swift中又出现了,最简单的闭包就是函数内部的函数引用了该函数的局部变量或常量,有点点拗口,闭包的功能确实很强大,伟大的jQuery就是闭包的产物

在js中的闭包

function add(name){
    var count = 0 ;
    function test(){
        alert(name+"="+count);
    }    
    return test;
}
//当外部函数执行完之后,会返回一个函数
var newFunc = add("小强");
newFunc();//打印输出
//当外部函数执行完后,局部变量并不会被gc回收,因为返回的函数引用了外部函数的变量,导致变量的引用计数不是0

在swift中,闭包形式也是这样的

func add(name: String) ->()->Int {
    var count = 0
    func test() ->Int{
        println("\(name)")
        return ++count
    }
    return test
}
//函数执行跟js中的调用一样一样地
//在全局函数中有个sort函数,就是以闭包的方法对数组进行排序的,返回一个新的有序数组
let names = ["A","E","F","C","B"]
//sort函数需要传入两个参数,第一个参数为数组,第二个参数其实就是一个函数,但它在内部实现应该是引用了数组中的///属性 var newArray = sort(names,function)

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

var newArray = sort(names,sortFunction)

//内联闭包表达式方法,可以简化以上操作//非常相似匿名函数
newArray = sort(names,{(s1: String,s2: String)->Bool in return s1>s2})
//闭包表达式方法{(参数) -> returnType in statements}
//swift 的强大之处在于,可以根据自己的需要去推断函数的参数类型,返回类型,所以上的内联函数参数类型可以省略,///返回类型也可以省略
newArray = sort(names,{s1,s2 in return s1>s2})
//单表达式闭包隐式返回,单行表达式闭包可以通过隐藏return关键字来隐式返回单行表达式的结果,如上版本的例子可以改//写为: 
newArray = sort(names,{s1,s2 in s1>s2}) 

//我感觉这么写对代码的可读性有点影响,最好还是写上return



//参数名缩写,swift为内联函数提供了这个方法,可以通过$0,$1,$3..顺序的去调用参数,(这个是借鉴的正则表达式的//方法么)
//以上函数可以写成
newArray = sort(names,{$0>$1})
//文档中还有一个更简单的写法,swift 的string定义了 > 的字符串实现,接收两个string参数,返回boolean
//swift会自动推断出你想用>的函数实现,更简洁写法
newArray = sort(names,>)

//当看到尾随闭包时,感觉好新鲜的,感觉这种方式可能用的比较广,自我感觉

func trailClosures(closure: () -> ()){
    //函数接收一个返回函数的函数类型的函数
}
//不使用尾随闭包,用内联函数去传参
trailClosures({()->() in return {() in 。。。}})//不知道这样写对不对,没机器测试啊,苦逼。。。。中..
//如果使用尾随闭包,
trailClosures(){   
}
//当参数只是一个函数类型时,函数的()也可以省略 
trailClosures{
}
//数组有个map方法,来看一下用尾随闭包去写
var number = [1,2,3,4]
number.map({ (a: Int) ->String in return String(a) })//内联闭包的写法
//尾随闭包的写法
var newArray = number.map{
    (var num) -> String in 
    var output = ""
    while num >0 {
       // output 处理
    }
    return output
}
//****闭包是引用类型****//


© 著作权归作者所有

代码诱惑
粉丝 1
博文 5
码字总数 3223
作品 0
济南
程序员
私信 提问
中文版 Apple 官方 Swift 教程《The Swift Programming Language》

简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构体 属性 方法 下标 继承...

FlutterStudy
07/10
0
0
swift,Array的高阶函数使用一: map

对于喜欢直接看代码的小伙伴们来说,可以直接跳过 一、二、三,直接看第四步,就找到你喜欢的code了。 一、学习背景 使用swift语言也有一年了,说来惭愧,遇到问题百度的时候多,大部分都是问...

like_sunflower
01/04
0
0
Swift讲解专题八——闭包

Swift讲解专题八——闭包 一、引言 Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。 二、从一个系统函...

珲少
2016/05/14
879
3
《从零开始学Swift》学习笔记(Day 22)——闭包那些事儿!

原创文章,欢迎转载。转载请注明:关东升的博客 我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。...

智捷课堂
2015/10/14
29
0
Swift3.0 函数闭包与 Block

最近新接手了一个Swift项目,花点时间做点小结,以做记录 我的博客链接 Swift中定义一个基本函数 这里下划线 的作用用来忽略外部參数名,具体可以参考这篇文章 带参函数定义 举栗子,网络数据...

PetitBread
2017/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部