刚接触Swift,如有不对,欢迎指正

  • Swift中定义一个基本函数
//定义一个函数,接收一个字符串,返回一个String类型的值
func test(name:String) -> String { return ("输出了\(name)")
}
//通用形式
func name(parameters) -> return type {
function body
}
  • Swift 中基本的闭包函数与OC中Block的相似点

  • 带参闭包
    //OC中Block是这样
    void (^test) (NSString *)=^(NSString *name){ NSLog(@"%@",name); }; test(@"测试");
    //对应到swift的带参闭包 let test={(_ name:String)->() in // in 后面就是回调之后处理的函数 ,相当于是Block之后的{ }
    print(name) } test("测试") //通用形式
    {
    (parameters) -> returnType in
    code
    } 这里下划线 _ 的作用用来忽略外部參数名,具体可以参考这篇文章http://www.cnblogs.com/bhlsheji/p/4746072.html
  • OC中带Block参数的函数定义
-(void)loadData:(  void(^)(void) )completetion
{
completetion();
}
  • Swift中带闭包参数的函数定义
func loadData(completetion: ()->()) -> () {
completetion()
}
//样式 func: ()->()
  • 举个比较常用的例子,网络数据获取
//OC中Block传值
-(void)loadData:( void(^)(NSArray *) )completetion
{ //这里暂时先忽略掉线程,简单处理,重点在swift闭包
NSLog(@"耗时操作"); sleep();//模拟网络请求 NSArray *arr=@[@"",@""]; NSLog(@"主线程回调"); completetion(arr); //返回获得的数据 } 调用:
[self loadData:^(NSArray *callBack){ NSLog(@"%@,%@",callBack[],callBack[]); }]; 输出:
-- ::45.273 tessst[:] 耗时操作
-- ::47.345 tessst[:] 主线程更新
-- ::47.346 tessst[:] , //swift中闭包传值
func loadDate(completion: @escaping (_ result : [String])->()) -> () { //这里有一个很重要的参数 @escaping,逃逸闭包
//简单来说就是 闭包在这个函数结束前内被调用,就是非逃逸闭包,调用的地方超过了这函数的范围,叫逃逸闭包
//一般网络请求都是请求后一段时间这个闭包才执行,所以都是逃逸闭包。
// 在Swift3.0中所有的闭包都默认为非逃逸闭包,所以需要用@escaping来修饰
DispatchQueue.global().async { print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: )
let json=["",""] DispatchQueue.main.async {
print("主线程更新\(Thread.current)") completion(json)
//函数在执行完后俩秒,主线程才回调数据,超过了函数的范围,这里就是属于逃逸闭包,如果不用@escaping,编译器是编译不过的
}
}
} 主函数调用loadDate:
loadDate { (callBack) in
print("\(callBack)")
} 输出值
耗时操作<NSThread: 0x608000069140>{number = , name = main}
主线程更新<NSThread: 0x608000069140>{number = , name = main}
1,2
  • 在Block中经常会有循环引用的情况,闭包中也一样,常用的解决方式有俩种
//第一种
weak var weakwelf=self
//套用oc的方式(__weak typedef(weakself)=self).
//这里要注意,不能用 let ,因为self可能会释放指向nil,相当于是一个可变值 //调可选项发送消息的时候 用 ? 解包 不用 ! pringt("weakself ?.view") 不用" weakself!.view"
//因为强制解包一旦weakself=nil时会崩溃 //第二种,在调用时候
//[weak self]标识在{}中所有的self都是弱引用
loadDate { [weak self] in
print(self?.view)
}
  • 尾随闭包

尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。可以使用尾随闭包来增强函数的可读性。

    func someFunctionThatTakesAClosure(closure: () -> ()) {
// 函数体部分
} // 以下是不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure({
// 闭包主体部分
}) // 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
// 闭包主体部分
}

续更...

Swift3.0 函数闭包与 Block的更多相关文章

  1. Swift3.0 函数闭包与OC Block

    刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...

  2. python学习-42 装饰器 --- 函数闭包1

    函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...

  3. 7 函数——《Swift3.0从入门到出家

    6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...

  4. Swift3.0语言教程查找字符集和子字符串

    Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...

  5. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  6. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  7. 突然兴起复习一下Swift3.0

    /// 参考Swift3.0.1文档 /// 摘录来自: Apple Inc. "The Swift Programming Language (Swift 3.0.1)". iB ...

  8. Swift3.0 功能一(持续更新)

    修改项目名称两种方式 1.Bundle name 2.Bundle display name try 三种处理异常的方式 // 在swift中提供三种处理异常的方式 // 方式一:try方式 程序员手 ...

  9. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

随机推荐

  1. Codeforces A ACM (ACronym Maker) (dp)

    http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...

  2. 数据倾斜是多么痛?spark作业调优秘籍

    目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么?      CSDN日报20170703——<从高考到程序员——我一直在寻找答案>      [直播]探究L ...

  3. linux下使用OpenCV的一些问题

    完整正确的代码如下: import cv2 import numpy as np image = cv2.imread('Pictures/a.png') cv2.imshow('original_i ...

  4. ftl-server静态资源服务器

    ftl-server 是一前端开发工具,支持解析freemarker模板,模拟后端接口,反向代理等功能. 特性 解析freemarker模板 静态资源服务 mock请求 代理请求 livereload ...

  5. Hermite 矩阵的特征值不等式

    将要学习 关于 Hermite 矩阵的特征值不等式. Weyl 定理 以及推论.   Weyl 定理 Hermann Weyl 的如下定理是大量不等式的基础,这些不等式要么涉及两个 Hermite 矩 ...

  6. nyoj-1103-区域赛系列一多边形划分

    http://acm.nyist.net/JudgeOnline/problem.php?pid=1103 区域赛系列一多边形划分 时间限制:1000 ms  |  内存限制:65535 KB 难度: ...

  7. Use-After-Free

    0x00 UAF利用原理 uaf漏洞产生的主要原因是释放了一个堆块后,并没有将该指针置为NULL,这样导致该指针处于悬空的状态(这个指针可以称为恶性迷途指针),同样被释放的内存如果被恶意构造数据,就有 ...

  8. iBeacon技术

    声明:部分资料来源自互联网 前言 iBeacon 最早推出是在今年的苹果 WWDC 大会上.作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4 ...

  9. Mac更改显存

    今天尝试了 发现很有效果 不敢独享 所以贴一下,如果我火星了 ..就无视我吧 问题表现为: 1. 随机出现花屏,和 横线. 随机出现死机2. 随着再次渲染(例如桌面背景切换),花屏或横线会消失3. 当 ...

  10. [LUOGU] P1387 最大正方形

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...