今天需要掌握的内容就是:闭包、类、结构体、属性(计算属性和延迟属性)
同样里面有一些题目,有兴趣的可以做一下.
首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量和对象等)
其次我们需要掌握如何定义类和结构体,和我们学习java有什么不同点.
类的定义
class 类名{
//需要定义的属性
}
结构体的定义
struct 结构体名{
//需要定义的属性
}
大家看它们的不同就是一个是class,一个是struts,现在先不揭秘让他们的区别,在代码中,我们将会看到它们的不同.
我们先来学习闭包:
在闭包的使用中,我们会先从一个比较齐全的闭包开始,一步一步进行简化.
1 var str = "Hello, playground" 2 3 4 5 func outer() -> ()->Void{ 6 7 let x = 2 8 9 func inner() { 10 11 print(x) 12 13 } 14 15 return inner 16 17 } 18 19 20 21 let result = outer() 22 23 result() 24 25 //闭包:一个代码块(一般指的就是函数)以及被它捕获的一些 26 27 //成员(变量,对象等等) 28 29 30 31 //闭包的种类有三种 32 33 //1.就是一个普通的全局函数,这是一个有名字的闭包。 34 35 //2.内部函数,比如上面的inner,此函数可以捕获它声明的时候所用到的东西 36 37 //3.闭包表达式,类似于c#语言的lambda表达式 38 39 40 41 42 43 func outer2 (f: ()->Void) { 44 45 f() 46 47 func outer3 (f: (Int,Int) -> Int) { 48 49 let re = f(1,2) 50 51 print(re) 52 53 } 54 55 56 57 outer3(f: {(a: Int, b: Int) in 58 59 print("test...") 60 61 return a + b 62 63 }) 64 65 //闭包的语法:闭包等价于创建了一个匿名函数 66 67 //格式:{(参数名: 类型,参数名: 类型) in } 68 69 70 71 72 73 let arr = [1,19,6,8,33] 74 75 76 77 //最完整的闭包写法 78 79 //let filtered = arr.sorted(by: {(a: Int,b: Int) in 80 81 // 82 83 // return a < b 84 85 //}) 86 87 88 89 //类型可以依据sorted方法的声明,推断出来,所以可以省略 90 91 //let filtered = arr.sorted(by: {(a ,b ) in 92 93 // 94 95 // return a < b 96 97 //}) 98 99 100 101 102 103 //因为只有一行代码,自动把此行代码的结果返回出去,所以可以去掉return 104 105 //let filtered = arr.sorted(by: {(a ,b ) in 106 107 // // print("sfda") 108 109 // a < b 110 111 //}) 112 113 114 115 //因为swift自动提供隐含的变量名,以$0开始,所以 116 117 //参数可以去掉,因为参数去掉in就没意义,所以in也可以去掉 118 119 //let filtered = arr.sorted(by: { $0 < $1}) 120 121 122 123 //因为sorted方法只有一个参数,而且是函数类型的参数 124 125 //所以可以把闭包写在小括号的外面 126 127 //let filtered = arr.sorted(by:){ $0 < $1} 128 129 130 131 //因为只有一个参数 132 133 let filtered = arr.sorted{ $0 < $1} 134 135 filtered 136 137 138 139 //swift中的一些符号其实是函数,比如下面的> 140 141 let filtered2 = arr.sorted(by: >) 142 143 print(filtered2) 144 145 146 147 /*** escaping(跳出,逃出)和自动闭包(autoclosure)*/ 148 149 150 151 //自动闭包,就是把表达式自动转换为闭包 152 153 //有前提:函数的声明不能有参数,但必须有返回值,返回值的类型,没有要求 154 155 func outer3(f: @autoclosure ()-> Int ) { 156 157 let s = f() 158 159 print(s) 160 161 } 162 163 outer3(f: 555) 164 165 166 167 //escaping : 函数传递进去时,没有使用,需要加escaping 168 169 var farr = [()-> Void]() 170 171 func outer4(f: @escaping () -> Void ) { 172 173 farr.append(f) 174 175 } 176 177 outer4(f: {print("escaping....")}) 178 179 farr.first?() 180 181 182 183 //可以这样理解:闭包就是一个函数的替代,简化一些方法的使用 184 185 186 187
接下来就是类和结构体的讲解
1 /********类与结构********************/ 2 3 4 5 class SomeClass { 6 7 let a = 5 //存储属性 8 9 var b = 6 10 11 } 12 13 struct SomeStruct { 14 15 let a = 5 16 17 var b = 6 18 19 } 20 21 let lei = SomeClass() 22 23 //不行:lei = SomeClass() 24 25 //lei.a = 333 不能改 26 27 lei.b = 444 28 29 let jiegou = SomeStruct() 30 31 //jiegou.a = 5555 32 33 //jiegou.b = 6666 //a,b 都不能改变值 34 35 //a,b不能修改原因就是结构是一个值类型 36 37 38 39 var jiegou2 = SomeStruct() 40 41 //jiegou2.a = 222 42 43 jiegou2.b = 333 44 45 jiegou2.b 46 47 /* 48 49 类与结构: 50 51 1.类是引用类型,结构是值类型 52 53 2.类可以继承,结构不能 54 55 56 57 什么时候用结构? 58 59 1.你的类型,如果只是一些数据的封装,那么可以考虑用结构 60 61 62 63 用结构的案例: 64 65 矩形:长,宽 66 67 地址:家庭地址,办公地址 68 69 */
最后面就是属性
1 /************* 属性 ****************/ 2 3 4 5 //存储属性(stored property) 6 7 //class SomeClass2 { 8 9 // var p1 = 6 10 11 //} 12 13 14 15 class SomeClass2 { 16 17 var p1 = 6 { 18 19 willSet { 20 21 print("before(newValue)") 22 23 } 24 25 didSet { 26 27 print("after(oldValue)") 28 29 } 30 31 32 33 } 34 35 } 36 37 let ins = SomeClass2() 38 39 ins.p1 = 8 40 41 //计算属性 42 43 class SomeClass2 { 44 45 var other = 0 46 47 var p: Int { 48 49 get { 50 51 return other 52 53 } 54 55 set { 56 57 other = newValue 58 59 } 60 61 } 62 63 //在swift中不能有只写(只有set) 64 65 //可以有只读属性,此时可以省略掉get{} 66 67 var p1: Int { 68 69 print("asdf") 70 71 return 888 72 73 }//p1 end 74 75 } 76 77 //属性的demo 78 79 class Person { 80 81 var name = "" 82 83 var _age = 0 84 85 var chengnianren = false 86 87 var age: Int { 88 89 get{ 90 91 return _age 92 93 } 94 95 set { 96 97 if newValue >= 18 { 98 99 chengnianren = true 100 101 } else { 102 103 chengnianren = false 104 105 } 106 107 _age = newValue 108 109 } 110 111 } 112 113 } 114 115 let p = Person() 116 117 p.age = 20 118 119 p.chengnianren 120 121 p.age = 16 122 123 p.chengnianren 124 125 //*********** 延迟属性 **************** 126 127 class A { 128 129 init() { 130 131 print(" a实例化") 132 133 } 134 135 } 136 137 let ains = A() 138 139 class B { 140 141 let name = "cj" 142 143 lazy var lazyp = A() 144 145 } 146 147 let bins = B() 148 149 bins.name 150 151 bins.lazyp 152 153 //静态的属性,可以用static与class修饰 154 155 //class不能修饰在存储属性上 156 157 //静态的属性里面只能访问静态的其它成员 158 159 //class修饰的成员是可以被子类所重写的而static修饰的是不能被重写的。 160 161 class C { 162 163 static var sp = 5 164 165 var sp2 = 6 166 167 class var sp3: Int { 168 169 get{ 170 171 return 555 172 173 } 174 175 set{ 176 177 sp = newValue 178 179 } 180 181 } 182 183 } 184 185 C.sp 186 187 C.sp3 = 23
闭包还是有点难理解的,但是细细品味就会有不一样的味道,就像红酒一般得细细品.