swift语言的Block
- //
- // blockDemo.swift
- // swiftDemo
- //
- // Created by apple on 14-6-29.
- // Copyright (c) 2014年 fengsh. All rights reserved.
- //
- import Foundation
- //无参无返回值
- typealias funcBlock = () -> () //或者 () -> Void
- //返回值是String
- typealias funcBlockA = (Int,Int) -> String
- //返回值是一个函数指针,入参为String
- typealias funcBlockB = (Int,Int) -> (String)->()
- //返回值是一个函数指针,入参为String 返回值也是String
- typealias funcBlockC = (Int,Int) -> (String)->String
- class blockDemo
- {
- //block作为属性变量
- var blockProperty : (Int,Int) -> String = {a,b in return ""/**/} // 带初始化方式
- var blockPropertyNoReturn : (String) -> () = {param in }
- var blockPropertyA : funcBlockA? //这写法就可以初始时为nil了,因为生命周其中,(理想状态)可能为nil所以用?
- var blockPropertyB : funcBlockB! //这写法也可以初始时为nil了,因为生命周其中,(理想状态)认为不可能为nil,所以用!
- init()
- {
- println("blockPropertyA = \(blockPropertyA) , blockPropertyB = \(blockPropertyB)")
- println("blockProperty = \(blockProperty) , blockPropertyNoReturn = \(blockPropertyNoReturn)")
- }
- func testProperty(tag:Int)
- {
- switch (tag)
- {
- case 1:
- self.blockPropertyNoReturn("OK GOOD")
- case 2:
- if let exsistBlock = self.blockPropertyA
- {
- let result = self.blockPropertyA!(7,8)
- println("result = \(result)")
- }
- case 3:
- if let exsistBlock = self.blockPropertyB
- {
- let fc = self.blockPropertyB(1,2)
- fc("输出")
- }
- default:
- let ret = self.blockProperty(3,4)
- println(ret)
- }
- }
- //block作为函数参数
- func testBlock(blockfunc:funcBlock!)//使用!号不需要再解包
- {
- if let exsistblock = blockfunc
- {
- blockfunc() //无参无返回
- }
- }
- func testBlockA(blockfunc:funcBlockA!)
- {
- if let exsistblock = blockfunc
- {
- let retstr = blockfunc(5,6)
- println(retstr)
- }
- }
- func testBlockB(blockfunc:funcBlockB!)
- {
- if let exsistblock = blockfunc
- {
- let retfunc = blockfunc(5,6)
- retfunc("结果是")
- }
- }
- func testBlockC(blockfunc:funcBlockC!)
- {
- if let exsistblock = blockfunc
- {
- let retfunc = blockfunc(5,6)
- let str = retfunc("最终果结是")
- println(str)
- }
- }
- }
执行测试码:
- var bk = blockDemo()
- //block设置前,啥也没有输出
- bk.testProperty(0)
- bk.testProperty(1)
- bk.testProperty(2)
- bk.testProperty(3)
- println("==============设置block属性================")
- bk.blockProperty = {
- (a :Int,b:Int) -> String in
- let c = a*100+b
- return "\(a)*100+\(b) = \(c)"
- }
- bk.testProperty(0)
- bk.blockPropertyNoReturn = {
- (param:String) -> () in
- println("input param value is : \(param)")
- }
- bk.testProperty(1)
- bk.blockPropertyA = {
- (a:Int,b:Int) -> String in
- let c = a*100+b*200
- return "\(a)*100+\(b)*200 = \(c)"
- }
- bk.testProperty(2)
- bk.blockPropertyB = {
- (a:Int,b:Int) -> (String)->() in
- func sumprint(result:String)
- {
- let c = a + b;
- println("sumprint func print:parame :\(result) \(a) + \(b) = \(c)")
- }
- return sumprint
- }
- bk.testProperty(3)
- println("==============属性block完成================")
- println("==============函数block为nil时无输出================")
- bk.testBlock(nil)
- bk.testBlockA(nil)
- bk.testBlockB(nil)
- bk.testBlockC(nil)
- println("==============函数block操作================")
- bk.testBlock({
- //do something
- println("无参无返回值block 执行")
- })
- bk.testBlockA({
- (a:Int,b:Int) -> String in
- let c = a*400+b*1000
- return "\(a)*400 + \(b)*1000 is \(c)"
- })
- bk.testBlockB({
- (a:Int,b:Int) -> (String)->() in
- func sumprint(result:String)
- {
- let c = a / b;
- println("sumprint func print:parame :\(result) \(a) / \(b) = \(c)")
- }
- return sumprint
- })
- bk.testBlockC({
- (a:Int,b:Int) -> (String)->String in
- func sumrsult(res:String) -> String
- {
- let c = a*a+b*a
- return "\(res) \(a)*\(a)+\(b)*\(a) = \(c)"
- }
- return sumrsult
- })
下面是输出结果
- blockPropertyA = nil , blockPropertyB = nil
- blockProperty = (Function) , blockPropertyNoReturn = (Function)
- ==============设置block属性================
- 3*100+4 = 304
- input param value is : OK GOOD
- result = 7*100+8*200 = 2300
- sumprint func print:parame :输出 1 + 2 = 3
- ==============属性block完成================
- ==============函数block为nil时无输出================
- ==============函数block操作================
- 无参无返回值block 执行
- 5*400 + 6*1000 is 8000
- sumprint func print:parame :结果是 5 / 6 = 0
- 最终果结是 5*5+6*5 = 55
相关文章:
吴恩达老师深度学习视频课笔记:目标检测
目标定位:如下图,图像分类任务就是算法遍历图像,判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car,还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位࿰…

国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
2019 嵌入式智能国际大会即将来袭!购票官网:https://dwz.cn/z1jHouwE2019年12月6日-8日,2019嵌入式智能国际大会将在深圳华侨城洲际大酒店举行。本次大会由哈尔滨工业大学(深圳)、清华大学国际研究生院、CSDN、嵌入式视…

Linux简介总结
1. Linux 就是Unix, 但是Unix 并不一定是Linux.2. 三种软件模式:商业软件,共享软件,自由软件。3. 为什么使用Linux? 它是一个自由软件。第一:可免费提供给任何用户使用。第二:它的源代码公开和可自…

Swift中编写单例的正确方式
本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文:THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性。 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使…
C语言中的弱符号与强符号介绍
弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引:程序标头中记载了运行时所需的段࿰…

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类
作者 | Thilina Rajapakse译者 | Raku编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transfor…
StarUML中时序图添加小人
转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候,发现有些的时序图上有小人的图标,可是一些UML工具却没有找到小人的图标,这让我很闹心,一直没解决,今天终于将该问题给解…

Swift学习: 从Objective-C到Swift
作者:方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…

C/C++中static关键字用法汇总
1. 函数内static局部变量:变量在程序初始化时被分配,直到程序退出前才被释放,也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。多次调用,仅需一次初始化。2. cpp内的static全局变量&…

CornerNet: 成对关键点物体检测 | CSDN博文精选
作者 | 贾小树来源 | CSDN博客文章目录1、论文总述2、使用锚定框的两个缺点3、角点检测比边界框中心或 proposals效果好的两个原因4、corner pooling5、用于Grouping Corners的 embedding vector的工作原理6、正负样本的分配方式(改进的focal loss)7、角…

PHP创建日志记录(已封装)
1 <?php2 3 class Logs{4 private $_filepath; //文件路径5 private $_filename; //文件名6 private $_filehandle; //文件引擎7 8 9 public function Logs($dir null,$filename null){ 10 11 $this->_filepath empty($dir) ? : $d…

如何用Swift实现一个好玩的弹性动画
本文由CocoaChina译者浅夏旧时光翻译自Raywenderlich 原文:How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出,你必须花费一些时间为…

深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选
来源 | Python编程时光(ID:Python-Time)所谓的模块导入,是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用。也许你看到这个标题,会说我怎么会发这么基础的文章?与此相反。恰恰我觉得这篇文章…
吴恩达老师深度学习视频课笔记:人脸识别
什么是人脸识别:人脸验证和人脸识别的区别,如下图:One-shot learning:人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图像或者单单一个人脸图像就能去识…

用小白鼠喝毒药
题设:有N瓶水,其中有一瓶水有剧毒,如果小白鼠喝了会在24小时的时候死亡。 问:用多少只小白鼠能够检测出哪瓶水有剧毒? 要求:用的小白鼠数量少并且用时要短,并给出合理的过程与结论。 我的解题思…

怎样在swift中创建CocoaPods
本文由yake_099(博客)翻译自raywenderlich,作者:Joshua Greene 原文:How to Create CocoaPods with Swift 你可能对一些比较著名的开源的CocoaPods框架比较熟悉,比如Alamofire、MBProgressHUD。但是有时你…
吴恩达老师深度学习视频课笔记:神经风格迁移(neural style transfer)
什么是神经风格迁移(neural style transfer):如下图,Content为原始拍摄的图像,Style为一种风格图像。如果用Style来重新创造Content照片,神经风格迁移可以帮你生成Generated图像。深度卷积网络在学什么:如下图…

“Jupyter的杀手”:Netflix发布新开发工具Polynote
作者 | Michael Li 译者 | Rosie 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100)【导读】10 月 29 日,Netflix 公开了他们内部开发的 Polynote。现如今,大型高科技公司公开其内部的工具或服务,然后受到业界…

System Center 2012 r2优点
System Center 2012System Center2012 是一个全面的管理平台,可帮助你轻松、高效地管理数据中心、客户端设备和混合云 IT 环境。为您提供了针对私有云、托管云和公有云基础结构和应用程序服务的通用管理工具集。可按照您的需求,为生产基础架构、可预期应…

Swift 闭包表达式
闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 闭包的形式主要有三种: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封…

GNU AWK中BEGIN/END使用举例
以下是使用gnu awk将test.cpp文件拆分成两个文件a.cpp和b.cpp,其中b.cpp仅存放test.cpp中的数据,其它内容存放在a.cpp文件中。test.cpp内容如下: #include <stdio.h> #include <iostream> #include <string>int main() {//…

目标检测的渐进域自适应,优于最新SOTA方法
作者 | Han-Kai Hsu、Chun-Han Yao、Yi-Hsuan Tsai、Wei-Chih Hung、Hung-Yu Tseng、Maneesh Singh、Ming-Hsuan Yang译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】目标检测的最新深度学习方法依赖于大量的边界框标注信息…

讨论下IDS的绕过
自从知道dedecms自带了80sec的内置Mysqlids后,一直以来也没有想到绕过的办法。或者是自己mysql的根底太差了吧。于是分析dedecms源码时,只找模板执行,本地包含,上传等,完全没有想到注入存在的可能性了。 可以看看某牛的…

GCC编译选项参数介绍
gcc和g分别是gnu的c和c编译器,下面是整理的常用编译选项参数: #(1). -x: 设定文件所使用的语言,使文件后缀名无效,如下,执行完后生成test.o gcc -c -x c test.jpg #(2). -c: 只编译生成目标文件即*.o,只编译不链接生成…

程序员自学到底有没有用?网友们吵翻了...
最近就有个程序员吐槽说,自己大学没怎么听老师讲课,老师讲的知识要么太旧,要么老师不会讲,自己大部分时间是在网上看视频学的。引发了以下激烈的讨论。很多网友觉得,学校老师的代码能力不行,现在技术更新又…

更新 FrameWork
这里把想要改变的东西封装到FrameWork以便实现热更新,提一下关于BundiD 一定要一致,在打包的时候一定在Edit scheme —— >Run 选择Release如图: 因为你要跑在真机上,所以这个要选择Release 另外将包含你想要放出的方法类添加…

把Illustrator矢量图转化为代码:Drawscript
2019独角兽企业重金招聘Python工程师标准>>> DrawScript是一款Illustrator插件,可以将Illustrator的矢量图片转换成代码,目前免费,支持转换的语言有 OBJ-CCJAVASCRIPTCREATEJS/EASELJSPROCESSINGACTIONSCRIPT 3JSONRAW BEZIER PO…

必读:ICLR 2020 的50篇推荐阅读论文
来源 | 香侬科技本文整理了ICLR2020的相关论文,此次分享的是从Openreview中选取的部分论文,共50篇,其中大部分为NLP相关。文中涉及的相关论文推荐指数与推荐理由仅为个人观点,利益无关,亦不代表香侬科技立场。希望大家…

14个Xcode中常用的快捷键操作
在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效,对于在代码文件中快速导航、定位Bug以及新增应用特性都是极有效的。 当然,你戳进这篇文章的目的也在于想要快速的对代码文件进行操作,或者是让Xcode的各面板更为适应你小本子的屏…

C++中标准模板库std::pair的实现
以下用C实现了标准模板库中的std::pair实现,参考了 cplusplus 和 vs2013中的utility文件。关于std::pair的介绍和用法可以参考: https://blog.csdn.net/fengbingchun/article/details/52205149 实现代码pair.hpp如下: #ifndef FBC_STL_PAIR_H…