闭包,协议delegate
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的更多相关文章
- 浅谈.NET中闭包
什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...
- Swift基础之Delegate方法的使用
本文简单介绍了使用Delegate方法的进行值的传递,改变上一个界面的字体大小和颜色 首先创建一个导航视图: let viewC = ViewController(); let navi ...
- Groovy中的闭包
Closures(闭包) 本节主要讲groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 ...
- Delegate模式
转载:http://www.cnblogs.com/limlee/archive/2012/06/13/2547367.html 代理模式 顾名思义就是委托别人去做事情. IOS中经常会遇到的两种情况 ...
- Swift 闭包的简单学习
OC中已经学习了闭包 在swift里面 该怎么处理 不多说 上代码 //(num:Int) ->Bool是闭包的参数类型 func hasCloserMatch(arr :[Int], valu ...
- iOS 【UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧】
在UIScrollView中会加入UIPageControl作为页码标识,能够让用户清楚的知道当前的页数.我们须要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们 ...
- IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端
这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...
- UIApplicationDelegate
App受到干扰时,UIApplication会通知它的delegate对象,让delegate处理系统事件. 项目中的AppDelegate已经遵守了UIApplicationDelegate协议 ...
- Gradle学习系列之五——自定义Property
在本系列的上篇文章中,我们讲到了增量式构建,在本篇文章中,我们将讲到如何自定义Project的Property. 请通过以下方式下载本系列文章的Github示例代码: git clone https: ...
随机推荐
- Vue v-bind
指令作用: 给元素的属性赋值 它是一个 vue 指令,用于绑定 html 属性 写法: 正常写法 <div v-bind:原属性名="变量||"常量""& ...
- CCCC 连续因子
题意: 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列 ...
- CodeForces - 748E Santa Claus and Tangerines(二分)
题意:将n个蛋糕分给k个人,要保证每个人都有蛋糕或蛋糕块,蛋糕可切, 1.若蛋糕值为偶数,那一次可切成对等的两块. 2.若蛋糕值为奇数,则切成的两块蛋糕其中一个比另一个蛋糕值多1. 3.若蛋糕值为1, ...
- POJ - 3659 Cell Phone Network(树形dp---树的最小点支配集)
题意:有N个点,N-1条边,任意两点可达,由此形成了一棵树.选取一个点a,它可覆盖自己以及与自己相邻的点,选取尽量少的点a,使得树中所有点都被覆盖,即求树的最小点支配集. 分析: 1.对于每一个点cu ...
- 关于Vue element-ui中诡异问题的解决思路
最近在做Element-ui项目时总是会出现些异步及其一些诡异问题,关于vue 的异步原理就不多说了,感觉大部分的问题都可以用Vue.nextTick来解决,Vue.nextTick是等DOM二次加载 ...
- @Autowired注解与@Resource注解的区别(详细)
相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到. 一.注解的出处 @Autowired是Spring提供的注解, ...
- KL散度与JS散度
1.KL散度 KL散度( Kullback–Leibler divergence)是描述两个概率分布P和Q差异的一种测度.对于两个概率分布P.Q,二者越相似,KL散度越小. KL散度的性质:P表示真实 ...
- 吴裕雄--天生自然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. ...
- [SWPU2019]Web1
0x00 知识点 bypass information_schema 参考链接: https://www.anquanke.com/post/id/193512 进行bypass之前先了解一下mysq ...
- JavaScript学习总结(八)
这一节结束,我们的JavaScript学习总结系列文章第一阶段就要结束了,今后会适当的补充一些高级的内容,敬请期待. 好了,废话不说进入这一节的学习. 联动框 联动框,实在是太常见了.比如淘宝,我们选 ...