1 // 结构体
2 struct Student
3 {
4 //结构体的属性
5 var age: Int
6 var name: String
7 //结构体的实例方法
8 func sayHello()
9 {
10 print("hello")
11 }
12 //结构体类方法
13 static func backName()
14 {
15 print("隔壁老王")
16 }
17 }
18 //结构体的构造方法
19 var 老王 = Student(age: 38, name: "王老五")
20
21 //对象调用实例方法
22 老王.sayHello()
23
24 //类名调用类方法
25 Student.backName()
26
27 //结构体的值类型(等于把一个对象的值复制一份给新对象)
28 var 老马 = 老王
29 老王.name = "老司机"
30 print(老王.name)
31
32 //类
33 class Teacher
34 {
35 //属性
36 var name: String? //? 代表可选类型,可以给值也可以不给
37 var age: Int = 0
38
39 //类的实例方法
40 func doSomething()
41 {
42 print("敲代码")
43 }
44
45 //类方法
46 class func saySomething()
47 {
48 print("说话")
49 }
50
51 //构造方法
52 init (age: Int, name: String)
53 {
54 self.age = age
55 self.name = name
56 }
57 }
58
59 //初始化对象
60 var liuhui = Teacher(age: 40, name: "刘辉")
61
62 //调用实例方法
63 liuhui.doSomething()
64
65 //调用类方法
66 Teacher.saySomething()
67
68 //类是引用类型(等于就兑现和新对象指向同一块内存)
69 var haiyang = liuhui
70 liuhui.age = 37
71 print(haiyang.age)
72
73 //存储属性和计算属性
74 class Rect
75 {
76 //存储属性
77 var point:(x: Int, y: Int) = (0, 0)
78 var size:(w: Int, h: Int) = (0, 0)
79 //计算属性
80 var center:(x: Int, y: Int)
81 {
82 get
83 {
84 print("get")
85 return (point.x + size.w / 2, point.y + size.h / 2)
86 }
87 set
88 {
89 print("set")
90 //newValue是系统提供的set值
91 //作为计算属性,不能接收值
92 size.w = (newValue.x - point.x) * 2
93 size.h = (newValue.y - point.y) * 2
94 }
95 }
96 }
97
98 var rect: Rect = Rect()
99 rect.point = (10, 10)
100
101 //走set方法
102 //rect.point = (50, 50)
103 //print(rect.size)
104
105 rect.size = (100, 100)
106
107 //走get方法
108 print(rect.center)
109
110 //属性观察器(和OC里的KVO差不多)
111 class Animal
112 {
113 var name: String = "🐶"
114 {
115 willSet
116 {
117 //系统提供的新值
118 print(newValue)
119 }
120 didSet
121 {
122 //系统提供的旧值
123 print(oldValue)
124 }
125 }
126 //析构方法
127 deinit
128 {
129 print("被释放了")
130 }
131 }
132
133 var pig: Animal?
134 = Animal()
135 print(pig!.name)
136 pig!.name = "***🐷"
137 print(pig!.name)
138 pig = nil
139
140
141 //练习
142 class Student2
143 {
144 var name: String = "HHH"
145 {
146 willSet
147 {
148 print(newValue)
149 }
150 didSet
151 {
152 print(oldValue)
153 }
154 }
155 }
156 var TTT: Student2 = Student2()
157 print(TTT.name)
158 TTT.name = "BBB"
159
160
161 //类的继承
162 class Person
163 {
164 //final 防止父类重写方法
165 final func eat()
166 {
167 print("吃饭")
168 }
169 func sleep()
170 {
171 print("睡觉")
172 }
173 func clickDD()
174 {
175 print("打豆豆")
176 }
177
178 }
179
180 class Women: Person
181 {
182 func upBaby()
183 {
184 print("生小孩")
185 }
186 // override重写父类方法
187 // override func eat()
188 // {
189 // print("戒了")
190 // }
191 }
192
193 var 景年: Women = Women()
194 景年.upBaby()
195 景年.eat()
196 景年.sleep()
197 景年.clickDD()
198
199
200 // Extension 扩展
201 extension Women
202 {
203 func becomeWomen()
204 {
205 print("去趟泰国吧")
206 }
207 }
208
209 景年.becomeWomen()
210
211 // 类的循环引用及解决办法
212 class Boy
213 {
214 //属性
215 var name: String = ""
216 //boy有一个女朋友
217 //weak 解决循环引用
218 weak var girlFriend: Girl?
219 //构造方法
220 init (name: String)
221 {
222 self.name = name
223 }
224 //析构方法
225 deinit
226 {
227 print("boy被释放了")
228 }
229 }
230
231 class Girl
232 {
233 //属性
234 var name: String = ""
235 //girl有一个男朋友
236 var boyFriend: Boy?
237 //构造方法
238 init (name: String)
239 {
240 self.name = name
241 }
242 //析构方法
243 deinit
244 {
245 print("girl被释放了")
246 }
247 }
248
249 var 海洋: Boy? = Boy(name: "海洋")
250 var 景年1: Girl? = Girl(name: "景年")
251
252 海洋?.girlFriend = 景年1
253 景年1?.boyFriend = 海洋
254
255 海洋 = nil
256 景年1 = nil