Swift 的函数和闭包
函数的关键字是 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 的函数和闭包相关推荐
- Swift -- 6.函数和闭包
函数 /* 函数分为函数名,参数,返回值,执行代码块四部分 有返回值函数可以作为一个值直接在print里输出 */ //函数定义 func max(a:Int, b:Int, c:Int) -> ...
- 《Swift开发实战》——第2章,第2.4节函数和闭包
本节书摘来自异步社区<Swift开发实战>一书中的第2章,第2.4节函数和闭包,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.4 函数和闭包 在本 ...
- Swift 1.1语言第7章 函数和闭包
Swift 1.1语言第7章 函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...
- Swift应用案例 2.闭包入门到精通
本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...
- Swift 中的Closures(闭包)详解
Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...
- php的匿名函数和闭包函数
php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- Swift 泛型函数补充
Swift 泛型函数[中文参考文档] 泛型使用的基本原则,执行时候需要知道具体泛型类型,即要么通过参数确定类型,要么通过返回值推导类型. 参考文档中已经给出来基本的泛型使用.基本都是通过参数去定类型 ...
- swift_015(Swift 的函数)
//***********swift学习之15--函数--*************************** /* Swift 定义函数使用关键字 func,由函数名.参数.返回值组成.参数和返回 ...
最新文章
- shedlock mysql_ShedLock日常使用
- c#rs232与三菱通讯_MCGS 与 FX3U PLC 之间的无线通讯实例
- 面向对象基础及UML建模语言
- hdu 1042 N!(大数)
- java 实现excel 导出功能
- php对帖子分类,php – MySQL:从类别中获取帖子
- WAP2.0(XHTML MP)基础介绍
- spring-boot actuator(监控)配置和使用
- 想搞一套AI问答游戏系统?简单,Google又开源了
- Javascript设计模式学习二(单例)
- [洛谷P4838]P哥破解密码
- 【转载】GitHub中国区前100名到底是什么样的人
- 对话月薪10万的技术老兵:技术人如何开心工作、快乐赚钱?
- 如何下载Windows和office官方镜像安装包,及安装激活详细步骤
- vs编译出现 0xC0000005
- com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.zyw
- 计算机网络原理课后作业答案,自考04741《计算机网络原理》课后习题答案
- CP-ABE,KP-ABE
- [好文!!!]pyecharts实现星巴克门店分布可视化分析
- Deepin上安装eclipse2021-03及其CDT插件