1.定义

//1.闭包表达式语法
{ (parameters) -> returnType in
statements
} let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
}) //2.单表达式闭包隐式返回
//单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } ) //3.参数名称缩写
//可以直接通过 $0 , $1 , $2 来顺序调用闭包的参数,以 此类推
reversedNames = names.sorted(by: { $ > $ } )
//例子中,$0和$1表示闭包中第一个和第二个 String 类型的参数。

2.尾随闭包

//1.闭包表达式语法
func someFunctionThatTakesAClosure(closure: () -> Void) { // 函数体部分
}
// 以下是不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure(closure: {
// 闭包主体部分
})
// 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
// 闭包主体部分
}
someFunctionThatTakesAClosure { } let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] let k = names.map { (a) -> Int in
if a == "Alex" {
return
}
else {
return
}
}
print(k)

3.逃逸闭包

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler) }

4.自动闭包

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] print(customersInLine.count)
// 打印出 "5"
let customerProvider = { customersInLine.remove(at: ) } print(customersInLine.count)
// 打印出 "5"
print("Now serving \(customerProvider())!") // Prints "Now serving Chris!" print(customersInLine.count)
// 打印出 "4"

5.别名

typealias AddBlock = (Int, Int) -> (Int)

let Add:AddBlock = {
(c,d) in
return c + d
} let Result = Add(,)
print("Result = \(Result)")

使用实例

6.回调,代替delegate,注意:循环引用,类似block,(只要控制器vc直接或间接拥有闭包,并在闭包中使用self,就会出现循环引用)

.自定义个view ,LyContentView
class LyContentView: UIView { //代替delegate,的闭包
var tapClick : (_ tap : UITapGestureRecognizer)->() = {_ in } override init(frame: CGRect) {
super.init(frame: .zero) //操作在这实现
let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapClick(_:)))
addGestureRecognizer(tap)
} @objc fileprivate func tapClick(_ tap : UITapGestureRecognizer) { print("点击了")
self.tapClick(tap)
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
.在控制器中使用
contentView.tapClick = { tap in
print("点击了view")
}

7.解决闭包循环引用

// weak var weakSelf = self;
// [weak self] () -> () in
// [unowned self] () -> () in 注意:这种不推荐使用
httpTool.loadRequest { [unowned self] () -> () in
self.view.backgroundColor = UIColor.redColor()
print("回到主线程", NSThread.currentThread());
}

8.封装网络请求

class func post(url : String , parameters : [String : String]? , header : [String : String]? , success : @escaping (_ response : [String : AnyObject])->() , failure : @escaping (_ error : Error)->()) {

        Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: header).responseJSON { (json) in

            switch json.result {
case .success(let value):
success(value as! [String : AnyObject])
case .failure(let error):
failure(error)
}
}
}

9.懒加载

fileprivate lazy var tableView : UITableView = {
let tableView = UITableView()
tableView.backgroundColor = UIColor.white
tableView.tableFooterView = UIView()
return tableView
}()

10.协议/代理,delegate

@objc protocol BaseModelDelegate : NSObjectProtocol {
//非必须实现的协议
@objc optional func arrayContainModelClass() -> ([String : Any])
@objc optional func dictContainModelClass() -> ([String : Any]) //必须实现的协议
func BaseModelKey()
}

闭包,协议delegate的更多相关文章

  1. 浅谈.NET中闭包

    什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...

  2. Swift基础之Delegate方法的使用

    本文简单介绍了使用Delegate方法的进行值的传递,改变上一个界面的字体大小和颜色 首先创建一个导航视图: let viewC = ViewController();        let navi ...

  3. Groovy中的闭包

    Closures(闭包) 本节主要讲groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 ...

  4. Delegate模式

    转载:http://www.cnblogs.com/limlee/archive/2012/06/13/2547367.html 代理模式 顾名思义就是委托别人去做事情. IOS中经常会遇到的两种情况 ...

  5. Swift 闭包的简单学习

    OC中已经学习了闭包 在swift里面 该怎么处理 不多说 上代码 //(num:Int) ->Bool是闭包的参数类型 func hasCloserMatch(arr :[Int], valu ...

  6. iOS 【UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧】

    在UIScrollView中会加入UIPageControl作为页码标识,能够让用户清楚的知道当前的页数.我们须要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们 ...

  7. IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端

    这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...

  8. UIApplicationDelegate

    App受到干扰时,UIApplication会通知它的delegate对象,让delegate处理系统事件. 项目中的AppDelegate已经遵守了UIApplicationDelegate协议   ...

  9. Gradle学习系列之五——自定义Property

    在本系列的上篇文章中,我们讲到了增量式构建,在本篇文章中,我们将讲到如何自定义Project的Property. 请通过以下方式下载本系列文章的Github示例代码: git clone https: ...

随机推荐

  1. Vue v-bind

    指令作用: 给元素的属性赋值 它是一个 vue 指令,用于绑定 html 属性 写法: 正常写法 <div v-bind:原属性名="变量||"常量""& ...

  2. CCCC 连续因子

    题意: 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列 ...

  3. CodeForces - 748E Santa Claus and Tangerines(二分)

    题意:将n个蛋糕分给k个人,要保证每个人都有蛋糕或蛋糕块,蛋糕可切, 1.若蛋糕值为偶数,那一次可切成对等的两块. 2.若蛋糕值为奇数,则切成的两块蛋糕其中一个比另一个蛋糕值多1. 3.若蛋糕值为1, ...

  4. POJ - 3659 Cell Phone Network(树形dp---树的最小点支配集)

    题意:有N个点,N-1条边,任意两点可达,由此形成了一棵树.选取一个点a,它可覆盖自己以及与自己相邻的点,选取尽量少的点a,使得树中所有点都被覆盖,即求树的最小点支配集. 分析: 1.对于每一个点cu ...

  5. 关于Vue element-ui中诡异问题的解决思路

    最近在做Element-ui项目时总是会出现些异步及其一些诡异问题,关于vue 的异步原理就不多说了,感觉大部分的问题都可以用Vue.nextTick来解决,Vue.nextTick是等DOM二次加载 ...

  6. @Autowired注解与@Resource注解的区别(详细)

    相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到. 一.注解的出处 @Autowired是Spring提供的注解, ...

  7. KL散度与JS散度

    1.KL散度 KL散度( Kullback–Leibler divergence)是描述两个概率分布P和Q差异的一种测度.对于两个概率分布P.Q,二者越相似,KL散度越小. KL散度的性质:P表示真实 ...

  8. 吴裕雄--天生自然TensorFlow2教程:数学运算

    import tensorflow as tf b = tf.fill([2, 2], 2.) a = tf.ones([2, 2]) a+b a-b a*b a/b b // a b % a tf. ...

  9. [SWPU2019]Web1

    0x00 知识点 bypass information_schema 参考链接: https://www.anquanke.com/post/id/193512 进行bypass之前先了解一下mysq ...

  10. JavaScript学习总结(八)

    这一节结束,我们的JavaScript学习总结系列文章第一阶段就要结束了,今后会适当的补充一些高级的内容,敬请期待. 好了,废话不说进入这一节的学习. 联动框 联动框,实在是太常见了.比如淘宝,我们选 ...