IOS系列swift语言之课时三

今天需要掌握的内容就是:闭包、类、结构体、属性(计算属性和延迟属性)

    同样里面有一些题目,有兴趣的可以做一下.

首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量和对象等)

其次我们需要掌握如何定义类和结构体,和我们学习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

闭包还是有点难理解的,但是细细品味就会有不一样的味道,就像红酒一般得细细品.

原文地址:https://www.cnblogs.com/lhh-njq-best/p/6086831.html