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. SQL COOKBOOK SQL经典实例代码 笔记第一章代码

    -- SQL COOKBOOK CHAPTER1 -- 查看所有内容 select * from emp; -- 可以单列 select empno,ename,job,sal,mgr,hiredat ...

  2. JavaEE--JNDI(下,实现)

    参考:https://blog.csdn.net/ouyida3/article/details/46699023  https://www.landui.com/help/show-6158.htm ...

  3. 18 12 25 css 基本语法以及页面使用

    css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值 css页面引入方法: 1.外联式:通过l ...

  4. PIP一次性导入所有环境和指定镜像源

    镜像源: 阿里云:https://mirrors.aliyun.com/pypi/simple/豆瓣:https://pypi.douban.com/simple/清华大学:https://pypi. ...

  5. Go-并发和并行-协程-信道-缓冲信道-select-mutex-读写文件-beego框架

    并发 Go 是并发式语言,而不是并行式语言.在讨论 Go 如何处理并发之前,我们必须理解何为并发,以及并发与并行的区别. 并发是什么? 并发是指立即处理多个任务的能力.一个CPU的情况下<意指看 ...

  6. art-template常用总结

    高性能JavaScript模板引擎原理解析:http://cdc.tencent.com/2012/06/15/%E9%AB%98%E6%80%A7%E8%83%BDjavascript%E6%A8% ...

  7. 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】

    题目 我的第一篇莫比乌斯反演题解 兴奋兴奋兴奋 贡献一个本人自己想的思路,你从未看到过的船新思路 [分析] 显然,题目要求求的是 \(\displaystyle Ans=\sum_{i=1}^n\su ...

  8. 201312-2 ISBN号码 Java

    就是把-去掉,然后验证,只需要改最后一位. import java.util.Scanner; public class Main { public static void main(String[] ...

  9. linux配置词典goldendict

    在mint 18下使用通过, ubuntu 类似. 方法: 通过软件中心安装goldendict,或者 sudo apt install goldendict 通过网页抓取程序, 见附录 下载朗道词典 ...

  10. maven deploy到私服去掉时间戳

    直接上代码在插件中的配置. <plugin> <artifactId>maven-war-plugin</artifactId> <version>3. ...