函数的关键字是 func ,函数定义的格式是:

func funcName(para:paraType) -> returnType{// code
}
复制代码

函数的参数标签

其中参数的那部分的详细结构是用小括号括起来,参数名,冒号,参数类型: (number:Int)。 在默认情况下,函数的参数标签使用参数名,或者用 _ 不使用参数标签,也可以自定义标签,我们定义一个奇葩的函数:

func 求和(数字1 num1:Float, 数字2 num2:Float) -> Float {return num1 + num2
}
复制代码

求和 就是方法名,数字1 就是自定义的参数标签。调用时会显示标签:

let sum = 求和(数字1: 2, 数字2: 4)
复制代码

函数返回多个值

swift 还可以用元组返回多个返回值:

func compare(numarray:([Int])) -> (min:Int, max:Int) {var min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max)
}
复制代码

调用时获取返回值:

compare(numarray: [1, 2, 3, 4, 5]).max
复制代码

函数嵌套函数

swift 语法中函数可以嵌套函数,用于分割太长或者太复杂的函数:

// 不要在意逻辑,只是为了示例一下。。。
func sumWithArray(numArray:([Int])) -> Int{var sum = 0func add(num1:Int, num2:Int) -> Int{return num1 + num2}sum = add(num1: numArray[0], num2: numArray[1])return sum
}
复制代码

返回一个函数

函数还可以用一个函数做为返回值

func makeMethod() -> ((Int)->(Int)) {func addOne(num:Int)->(Int){return num+1}return addOne
}
复制代码

函数调用:

print("makeMethod()(1993): ",makeMethod()(1993))
// makeMethod()(1993):  1994
/**
makeMethod() 返回的是一个函数,继续传入参数 1993,最后返回 1994
*/
复制代码

传入一个函数

函数可以把一个函数当做返回值返回,也可以当做一个参数来传入:

func sumOfMaxMin(numarray:([Int]),compare:(_ numarray:([Int]))->(min:Int, max:Int)) -> (Int) {return compare(numarray).max + compare(numarray).min
}
复制代码

可以看到, sumOfMaxMin 函数有两个参数:numarray:([Int])compare:(_ numarray:([Int]))->(min:Int, max:Int) 。其中 compare 是一个函数。

在调用的时候:

var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5],compare: compare)
复制代码

compare 是上个例子中的函数。当然,我们也可以不传入一个现成已经定义和实现的函数:

var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5]) { (numarray:([Int])) -> (min: Int, max: Int) invar min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max)
}
复制代码

函数是一种特殊的闭包

大家伙看到这里,肯定会一拍大腿:哎呦,这玩意不就是闭包嘛!

(The Swift Programming Language)函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。闭包中的代码能访问闭包所建作用域中能得到的变量和函数,即使闭包是在一个不同的作用域被执行的

我们可以使用{}来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离。

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({(num:Int) -> Int inlet newNum = num * 3return newNum
})
复制代码

闭包的简写

如果闭包的类型已知,那么可以省略参数和返回值的类型

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num inlet newNum = num * 3return newNum
})
复制代码

单个语句闭包会把它语句的值当做结果返回

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num innum * 3
})
复制代码

如果把上面的闭包写成一行的话

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num in num * 3})
复制代码

我们可以通过参数位置而不是参数名字来引用参数,那么上面的代码就变成这样

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({$0 * 3})
复制代码

当一个闭包是传给函数的唯一参数,我们可以完全忽略括号

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map{$0 * 3}
复制代码

我的博客:iosgg.cn/

Swift 的函数和闭包相关推荐

  1. Swift -- 6.函数和闭包

    函数 /* 函数分为函数名,参数,返回值,执行代码块四部分 有返回值函数可以作为一个值直接在print里输出 */ //函数定义 func max(a:Int, b:Int, c:Int) -> ...

  2. 《Swift开发实战》——第2章,第2.4节函数和闭包

    本节书摘来自异步社区<Swift开发实战>一书中的第2章,第2.4节函数和闭包,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.4 函数和闭包 在本 ...

  3. Swift 1.1语言第7章 函数和闭包

    Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...

  4. Swift应用案例 2.闭包入门到精通

      本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...

  5. Swift 中的Closures(闭包)详解

    Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...

  6. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  7. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  8. Swift 泛型函数补充

    Swift 泛型函数[中文参考文档] 泛型使用的基本原则,执行时候需要知道具体泛型类型,即要么通过参数确定类型,要么通过返回值推导类型. 参考文档中已经给出来基本的泛型使用.基本都是通过参数去定类型 ...

  9. swift_015(Swift 的函数)

    //***********swift学习之15--函数--*************************** /* Swift 定义函数使用关键字 func,由函数名.参数.返回值组成.参数和返回 ...

最新文章

  1. shedlock mysql_ShedLock日常使用
  2. c#rs232与三菱通讯_MCGS 与 FX3U PLC 之间的无线通讯实例
  3. 面向对象基础及UML建模语言
  4. hdu 1042 N!(大数)
  5. java 实现excel 导出功能
  6. php对帖子分类,php – MySQL:从类别中获取帖子
  7. WAP2.0(XHTML MP)基础介绍
  8. spring-boot actuator(监控)配置和使用
  9. 想搞一套AI问答游戏系统?简单,Google又开源了
  10. Javascript设计模式学习二(单例)
  11. [洛谷P4838]P哥破解密码
  12. 【转载】GitHub中国区前100名到底是什么样的人
  13. 对话月薪10万的技术老兵:技术人如何开心工作、快乐赚钱?
  14. 如何下载Windows和office官方镜像安装包,及安装激活详细步骤
  15. vs编译出现 0xC0000005
  16. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.zyw
  17. 计算机网络原理课后作业答案,自考04741《计算机网络原理》课后习题答案
  18. CP-ABE,KP-ABE
  19. [好文!!!]pyecharts实现星巴克门店分布可视化分析
  20. Deepin上安装eclipse2021-03及其CDT插件

热门文章

  1. 09-CNN手写数字识别
  2. 线性表------栈
  3. Bean的scope属性
  4. 用eclipse往mysql插入中文出现乱码解决方法
  5. Ananagrams Uva 156
  6. 树莓派设置静态IP的好处与坏处
  7. 【数字逻辑入门】计算机如何存储1位二进制数
  8. shell编程题(一)
  9. linux下源码安装vsftpd-3.0.2
  10. 【Leetcode | 01】Backtracking