本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。
嵌套类型
- 嵌套类型相当于其他语言中的内部类
![](https://img.haomeiwen.com/i4068785/07fb3248c23039b2.png)
枚举、结构体、类都可以定义方法
- 一般把定义在类、结构体、枚举内部的函数,叫做方法
class Size {
var width = 10
var height = 10
func show() {
print("width=\(width), height=\(height)")
}
}
let s = Size()
s.show() //width=10 height=10
----------------------------------------------------
struct Point {
var x = 10
var y = 10
func show() {
print("x=\(x), y=\(y)")
}
}
let p = Point()
p.show() //width=10 height=10
--------------------------------------
enum PokerFace: Character {
case spades = "♥", hearts = "♣"
func show() {
print("face is \(rawValue)")
}
}
let pf = PokerFace. hearts
p.show() //face is ♣
方法不论是定义在值类型、引用类型里面或者外面其都是存储在代码段的
闭包表达式
- 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
闭包的格式:
{
(参数列表) -> 返回值类型 in 函数体代码
}
var fn = {
(v1:Int , v2:Int) -> Int in
return v1 + v2
}
fn(10,20)
-------------------------------------
{
(v1:Int , v2:Int) -> Int in
return v1 + v2
}(10,20)
闭包表达式缩写
![](https://img.haomeiwen.com/i4068785/f441051ca4cb92c2.png)
更加简写的方式
exec(v1: 10, v2: 20, fn: +)
尾随闭包
- 如果将一个很长的闭包表达式作为函数的
最后一个实参
,使用尾随闭包可以增强函数的可读性 - 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式
func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {
print(fn(v1, v2))
}
--------------------------------------------
与上面代码等价
exec(v1:10, v2: 20) {
$0 + $1
}
- 如果闭包表达式是函数的唯一实参,而且使用尾随闭包的语法,那就不需要再函数名后边写圆括号
func exec(fn: (Int, Int) -> Int) {
print(fn(v1, v2))
}
--------------------------------------------
等价于上面代码
exec(fn: {$0 + $1})
exec() {$0 + $1}
exec {$0 + $1}
Array排序
官方定义
func sort(by areInIncreasingOrder: (Element, Element) -> Bool)
//返回true: i0排在i1前面
//返回false: i0排在i1后面
func cmp(i0: Int, i1: Int)->Bool {
//大的排前面
return i0 > i1
}
var arr = [10,3,4,20,90]
//从小到大排序
arr.sort()
//自定义排序规则:从大到小排序
arr.sort(by cmp(2,1))
//闭包表示
arr.sort{$0 > $1}
忽略参数
exec {
_ , _ in 20
}
表示不论传什么参数进来,都不管它;直接返回20
两个下划线表示两个参数
闭包(Closure
)
- 一个函数和它所捕获的变量、常量环境组合起来,称之为闭包
这里的函数是指:一般定义在函数内部的函数;一般它捕获的是外层函数的局部变量、常量
注意:一旦捕获了外部的局部变量和常量形成闭包就会在堆空间申请内存;
![](https://img.haomeiwen.com/i4068785/c314dbdb3338d46a.png)
- 可以把闭包想象成是一个类的实例对象
- 内存在堆空间
- 捕获的局部变量/常量就是对象的成员(存储属性)
- 组成闭包的函数就是类内部定义的方法
![](https://img.haomeiwen.com/i4068785/271f5d3fd6895f8d.png)
![](https://img.haomeiwen.com/i4068785/c0ba797d390f0796.png)
注意:如果返回值是函数类型,那么参数的修饰要保持统一
![](https://img.haomeiwen.com/i4068785/b12bb4b93b6e037c.png)
自动闭包
![](https://img.haomeiwen.com/i4068785/b90079dda85b9517.png)
网友评论