闭包,类,结构
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
func outer() -> ()->Void{
let x =
func inner() {
print(x)
}
return inner
}
let result = outer()
result()
//闭包:一个代码块(一般指的就是函数)以及被它捕获的一些
//成员(变量,对象等等)
//闭包的种类有三种
//1.就是一个普通的全局函数,这是一个有名字的闭包。
//2.内部函数,比如上面的inner,此函数可以捕获它声明的
//时候所用到的东西
//3.闭包表达式,类似于c#语言的lambda表达式
func outer2 (f: ()->Void) {
f()
}
outer2(f: {() in print("xxx") })
func outer3 (f: (Int,Int) -> Int) {
let re = f(1,2)
print(re)
}
outer3(f: {(a: Int, b: Int) in
print("test...")
return a + b
})
//闭包的语法:闭包等价于创建了一个匿名函数
//格式:{(参数名: 类型,参数名: 类型) in 代码体 }
let arr = [1,19,6,8,33]
//最完整的闭包写法
let filtered = arr.sorted(by: {(a: Int,b: Int) in
return a < b
})
//类型可以依据sorted方法的声明,推断出来,所以可以省略
let filtered = arr.sorted(by: {(a ,b ) in
return a < b
})
//因为只有一行代码,自动把此行代码的结果返回出去,所以可以去掉return
let filtered = arr.sorted(by: {(a ,b ) in
//print("sfda")
a < b
})
//因为swift自动提供隐含的变量名,以$0开始,所以
//参数可以去掉,因为参数去掉in就没意义,所以in也可以去掉
let filtered = arr.sorted(by: { $0 < $1})
//因为sorted方法只有一个参数,而且是函数类型的参数
//所以可以把闭包写在小括号的外面
let filtered = arr.sorted(by:){ $0 < $1}
//因为只有一个参数
let filtered = arr.sorted{ $0 < $1}
filtered
//swift中的一些符号其实是函数,比如下面的>
let filtered2 = arr.sorted(by: >)
print(filtered2)
/*** escaping(跳出,逃出)和自动闭包(autoclosure)*/
//自动闭包,就是把表达式自动转换为闭包
//有前提:函数的声明不能有参数,但必须有返回值,返回值的类型,没有要求
func outer3(f: @autoclosure ()-> Int ) {
let s = f()
print(s)
}
outer3(f: 555)
//escaping : 函数传递进去时,没有使用,需要加escaping
var farr = [()-> Void]()
func outer4(f: @escaping () -> Void ) {
farr.append(f)
}
outer4(f: {print("escaping....")})
farr.first?()
//可以这样理解:闭包就是一个函数的替代,简化一些方法的使用
/********类与结构********************/
class SomeClass {
let a = 5 //存储属性
var b = 6
}
struct SomeStruct {
let a = 5
var b = 6
}
let lei = SomeClass()
//不行:lei = SomeClass()
//lei.a = 333 不能改
lei.b = 444
let jiegou = SomeStruct()
//jiegou.a = 5555
//jiegou.b = 6666 //a,b 都不能改变值
//a,b不能修改原因就是结构是一个值类型
var jiegou2 = SomeStruct()
//jiegou2.a = 222
jiegou2.b = 333
jiegou2.b
/*
类与结构:
1.类是引用类型,结构是值类型
2.类可以继承,结构不能
什么时候用结构?
1.你的类型,如果只是一些数据的封装,那么可以考虑用结构
用结构的案例:
矩形:长,宽
地址:家庭地址,办公地址
*/