1 //MARK:-----------------控制流-----------------
2 //MARK: 1.for - in 循环 ,不用声明Value类型
3
4 //for value in 1...6 {
5 //print(value)
6 //
7 //}
8
9
10 //不需要具体的值,只是为了得到循环次数
11
12 //for _ in 1...6 {
13 //print("123")
14 //}
15
16
17 //MARK: 2.for循环,和C一样,只是没有 括号
18
19 //for var i = 0 ; i < 26 ; i++ {
20 //print("i = \(i)")
21 //}
22
23 //MARK: 3.while 循环,和C一致
24
25 //var whileValue = 0
26 //while whileValue < 10 {
27 // whileValue++
28 //
29 // print("while ++ -- \(whileValue)")
30 //}
31
32
33 //MARK: 4. do-while 循环
34
35 //var number = 0
36
37 //repeat {
38 //print("number -- \(number)")
39 //number++
40 //}while false
41
42 //repeat {
43 // print("number -- \(number)")
44 // number++
45 //}while number < 10
46
47 //MARK: 5. if-else 语句,分支语句
48 //var applePrice = 8.5 // double
49 //
50 //if applePrice < 5 {
51 //
52 // print("applePrice -- \(applePrice)")
53 //}else{
54 // print("applePrice -- \(applePrice)")
55 //}
56
57
58 //MARK: if-else语句 的值绑定 可以保护程序
59
60 //var optionValue :Int?
61 //var optionValue :Int? = 5
62 //if var tempOptionValue = optionValue {
63 // //如果可选类型有值,就走条件成立的语句
64 //print("value = \(tempOptionValue)")
65 //}else{
66 // //如果没有值,就走条件不成立的语句
67 // print("可选类型为nil")
68 //}
69
70
71
72 //MARK: 6.witch - case
73 //(1)Swift中没有自动贯穿,即使把break删掉,也不会贯穿达下个case语句
74 //(2)有需要贯穿需求的时候,需要加贯穿语句 fallthrough
75 //(3)如果case中,没有任何语句,就必须加break ,没有语句就不必加break
76 //(4)如果不写default,case语句必须包含所有情况。否则必须写。
77 //var switchValue = 11
78 //switch switchValue {
79 //case 10:
80 // print("10")
81 //// break
82 //case 11:
83 // print("11")
84 //// break
85 //
86 // fallthrough
87 //case 12:
88 // print("12")
89 //// break
90 //default:
91 // print("other")
92 //
93 //}
94
95 //MARK: switch -case 的值绑定
96 //当case条件满足时,进入case语句,把值赋给我们设的局部变量(常量)
97 //var (x,y) = (0,10)
98 //switch (x,y){
99 //case (let localX,0):
100 // print("localX = \(localX)")
101 //case (0,let localY):
102 // print("localY = \(localY)")
103 //default:
104 // print("other")
105 //}
106
107 //MARK: switch-case的区间匹配
108
109 //var money : Float = 10.5
110 //switch money {
111 //case 0...10:
112 // print("穷屌丝")
113 //case 10...100 :
114 // print("普通人")
115 //default:
116 // print("高富帅")
117 //}
118
119
120
121 /* 词语辨析
122 fallthrough :贯穿
123 continue :结束本次循环,进入下次循环
124 break:跳出循环
125 */
126
127
128 //MARK: 7.标签语
129 //sign: 主要用于循环嵌套:可以给循环加标签,这样可以给指定循环做一些操作.作用:更易于操作循环
130 //sign:while true {
131 //
132 // for var i = 0 ; i < 10 ; i++ {
133 //// 指定break是那个控制流
134 // if i == 5 {
135 // break sign
136 // }
137 // print("i -- \(i)")
138 // }
139 //}
140
141
142 //MARK: ----------------函数---------------------
143 //MARK: ----函数调用 --
144
145 /*
146 func 函数名(参数列表) ->返回值 {
147 //实现动作部分
148 }
149
150 */
151
152 //func 函数名()->返回值
153 //MARK: 1.无参无返回值 , 没有返回值可以不写 ->\
154
155 //func printFunc(){
156 //
157 //}
158
159
160 //func printFunc()->Void {
161 // print("123")
162 //}
163
164 ////diaoyong hanshu
165 //printFunc()
166
167 //MARK: 2.有参无返回值
168 //func printCity(cityName:String){
169 //print("城市--\(cityName)")
170 //}
171 //
172 ////调用函数
173 //printCity("郑州")
174
175
176 //MARK: 3.无参有返回值
177 //func returnString()->String{
178 //return "北京"
179 //}
180 //
181 //let string = returnString()
182 //
183 //print(string)
184 //
185 //print(returnString())
186
187
188 //MARK: 4.有参有返回值 :可以支持多个返回值
189
190 func matchFun(number1:Int,number2:Int)->(Int,Int){
191
192 // number1++
193 return (number1 + number2,number2 * number1)
194 }
195
196 //print(matchFun(2, number2: 3))
197
198
199 /*注意事项:
200 1.函数的形参是let类型(常量),而不是变量(变量);用var修饰形参可改变
201 2.交换两个数
202
203 */
204
205 //1.
206 func changeCity(var loveCityName:String){
207
208 loveCityName = "北京"
209 // print(loveCityName)
210 }
211
212 changeCity("上海")
213
214 //2.交换两个数
215 //函数中任意改变形参,实参不会变
216 //MARK: 注意:要改变实参,需要传进入地址(&),需要inout关键字---
217 func changeTwoNumber(inout number1 :Int,inout number2 :Int)->(Int,Int){//(1)
218
219 //func changeTwoNumber(var number1 :Int,var number2 :Int)->(Int,Int){//(2)
220
221 let tempNumber = number1;
222 number1 = number2;
223
224 number2 = tempNumber;
225
226
227 return (number1,number2)
228 }
229
230 var a = 1,b = 2
231
232 let (x,y) = changeTwoNumber(&a, number2: &b)//(1)
233 //let (x,y) = changeTwoNumber(a, number2: b)//(2)
234
235 //print((x,y))
236 //print("a- \(a),b - \(b)")
237
238
239
240 //MARK: 给函数添加一个外部形参名,作用:在函数调用时,可以看到
241
242 //func travelCity( cityName1:String,CityName:String, cityName3:String){//(1)
243
244 func travelCity(firstCity cityName1:String,sencondCity CityName:String,thirdCity cityName3:String){//(2)
245
246 //print("我的旅行路线\(cityName1)-->\(CityName)-->\(cityName3)")
247 }
248
249
250 //调用
251
252 //travelCity("北京", CityName:"马尔代夫", cityName3: "巴黎")//(1)
253 travelCity(firstCity: "北京", sencondCity: "马尔代夫", thirdCity: "巴黎")//(2)
254
255 // 简化的外部参数名:( 只需要在第一个参数名前加外部参数)
256 func travelCity1(cityName1 cityName1:String, CityName:String, cityName3:String){//(2)
257
258 // print("我的旅行路线\(cityName1)-->\(CityName)-->\(cityName3)")
259 }
260
261 //调用
262 //travelCity1(cityName1: <#T##String#>, CityName: <#T##String#>, cityName3: <#T##String#>)
263
264
265 //MARK:-----------------函数类型-----------------
266 //MARK:1.函数类型是由,函数的参数和返回值组成
267
268 func addFunc(number1 number1:Int,number2:Int) -> Int{
269 return number1 + number2
270 }//这个函数的类型就是 (Int,Int) ->Int
271
272
273
274 //MARK:2.定义函数类型的变量:类似typeDef
275 //var tongVar :String = "string"
276
277 var tongVar :(Int,Int)->Int = addFunc
278
279 //print(tongVar(3,4))
280
281
282 //MARK:3.将函数作为参数
283 //把addFunc2作为另一个函数的参数
284 func addFunc2(number1 number1:Int,number2:Int) -> Int{
285 return number1 + number2
286 }
287
288 //参数1- 参数名:match 参数类型:(Int,Int)->Int
289 //参数2- 参数名:number1 参数类型:Int
290 //参数3- 参数名:number2 参数类型:Int
291
292 //func ParaFunc(match match:(Int,Int)->Int,number1:Int,number2:Int){
293 // let resultNumber1 = match(number1,number2);
294 // print(resultNumber1)
295 //}//(1)
296
297 func ParaFunc(addFunc2 addFunc2:(Int,Int)->Int,number1:Int,number2:Int){
298
299
300 // print(addFunc2(number1,number2))
301 }//(2)
302
303 //调用
304
305 //ParaFunc(match: addFunc2, number1: 2, number2: 4)//(1)
306
307 ParaFunc(addFunc2: addFunc2, number1: 2, number2: 4)//(2)
308
309
310 //MARK:4函数作为返回值,返回值是一个函数类型
311
312 func mutiFun2(number1 number1:Int,number2:Int)->Int{
313 return number1 * number2
314 }
315
316 //定义一个函数,返回值类型是(Int,Int)->Int
317 //参数名:add 类型:Bool 返回值类型:(Int,Int)->Int
318 func selectFunc(isSelectAddFun add:Bool)-> ((Int,Int)->Int){
319
320
321 return add ? addFunc2 :mutiFun2;
322 }
323
324 let result = selectFunc(isSelectAddFun: false)//result 就是函数类型,即(Int,Int)->Int
325
326
327 //print(result(1,2))
328 //
329 //print(selectFunc(isSelectAddFun: true)(1,2))
330
331 //MARK:函数的嵌套
332 //func emedFun(judge judge:Bool,number:Int){
333 // //自增函数
334 // func addNumber(var number1:Int){
335 // print(++number1)
336 // }
337 // //自减函数
338 // func jianNumber(var number2:Int){
339 // print(--number2)
340 // }
341 // // 利用bool值去判断,调用自增还是自减
342 // let funcName = judge ? addNumber :jianNumber
343 // // 利用参数number去调用自增或者自减
344 // funcName(number)
345 //}
346
347 //调用
348
349 //emedFun(judge: false, number: 1)//在函数外层调用,对应只能调用函数外层
350
351
352 //MARK: 重点------闭包------
353 //类似OC中的block
354 //定义一个闭包
355 var block = { (str:String)-> Void in
356 // block块
357 // print(str)
358
359 }
360
361 //调用闭包
362 block("我爱北京天安门")
363
364
365 //MARK:-----------------枚举-----------------
366 /*
367 //1.枚举名首字母大写,枚举值首字母也大写
368 //2.swift的枚举和C的区别
369 2.1有case关键字
370 2.2枚举值有哈希值
371 */
372
373 /*
374 enum City{
375 case beijing
376 case Paris
377 case NewYork
378 }
379 print(City.NewYork.hashValue)
380
381 //3.原始值和rawValue
382
383 enum PoneType :String{
384 case Apple = "IPhone"
385 case MI = "Mi4"
386 // case HUAWEI = "荣耀"
387 case HUAWEI
388 }
389
390 print(PoneType.HUAWEI.rawValue)//如果有rawValue就会打印,否则打印case后枚举值
391
392
393 //通过rawValue找到对应的枚举值
394 var ii = PoneType(rawValue: "荣耀")
395
396 /*
397 //print(ii!.rawValue)//强制解析
398 print(ii?.rawValue)//可选解析
399 print(ii)//默认为可选解析
400 */
401
402
403 */
404
405
406 //MARK:相关值
407 //利用枚举的相关值结合switch-case进行值的绑定
408
409 enum Girl{
410 case Id(Int)
411 case Info(String,Int,Double)//姓名,年龄,身高
412 }
413
414 //进行值的绑定
415 /*
416 var girl = Girl.Info("貂蝉", 21, 165)
417
418 switch girl {
419 case Girl.Info(var girlName,var age,var height) :
420 print("name --\(girlName)")
421 case Girl.Id(var girlID):
422 print("ID -- \(girlID)")
423 }
424 */
425 //MARK:-----------------类-----------------
426
427 /*和OC区别:
428
429 1.运用class关键字
430 2.没有.h .m
431 3.在同一个括号内声明属性,书写方法
432
433 */
434
435 //定义一个类,关键字是Class,类名首字母大写
436 class Student {
437 //类的属性(实例变量),属性名studentAge,类型Int
438 var studentAge :Int
439 var studentName:String
440 // 给属性添加init方法,目的为给属性一个默认值
441 init(studentAge:Int,studentName:String){//一个类只能有一个init方法
442 // 给属性赋默认值
443 self.studentAge = studentAge
444 self.studentName = studentName
445 }
446
447 //MARK:注意--类方法 (函数)
448 func printStu(){
449 print(self.studentAge,self.studentName)
450 }
451
452 // 有参数有返回值
453 func change(stuName:String)->String{
454 self.studentName = stuName
455 return self.studentName
456 }
457 }
458
459 //调用该类
460 //实例化一个类对象
461 let studentItem = Student(studentAge: 26, studentName:"我饿了")
462 //属性的设置和访问
463
464 studentItem.studentAge = 24;
465
466 //print(studentItem.studentAge)
467
468 //studentItem.printStu()
469
470 //print(studentItem.change("嗯哼"))
471
472
473 //MARK: ---结构体---
474 //定义一个结构体,关键字struct
475 //结构体不需要写init方法,因为它已经为我们写好了
476 struct GirlSTR {
477 //属性
478 var girlName:String
479 var girlHeight:Double
480
481
482 // 方法
483 func printFourBeautifulGirls(girlName1:String ,girlName2:String, girlNmae3:String){//注意‘,’不可少
484 print("四大美女---\(self.girlName) \(girlName1) \(girlName2) \(girlNmae3)")
485
486 }
487
488 func printHeith(){
489
490 print(self.girlHeight)
491 }
492 }
493
494 //实例化一个结构体
495
496 var girl = GirlSTR(girlName: "小笼包", girlHeight: 20)
497
498 //访问结构体的属性,设置结构体属性
499 //print(girl.girlName)
500 girl.girlHeight = 1.60
501 //girl.printHeith()
502 //girl.printFourBeautifulGirls("1", girlName2: "2", girlNmae3: "3")
503
504
505 //MARK:类和结构体的区别
506
507 //1.类是引用类型,结构体是值类型
508 var studentItem2 = studentItem;
509 studentItem.studentAge = 2
510
511 print(studentItem.studentAge,studentItem2.studentAge)
512
513
514 var girl2 = girl
515 girl.girlHeight = 1.20
516 print(girl.girlHeight,girl2.girlHeight)
517
518
519 //2.类可以继承,结构体不能继承(最本质)
520
521 //3.结构体对象如果是let类型即使属性是var类型也是不可修改的。类对象即使是let类型,属性如果是var类型也是可以修改的
522
523 //MARK:恒等运算 ===
524 //用来对两个类实例(对象)进行判断,到底是否完全一致
525
526 if studentItem2 === studentItem {
527 print("两个实例相等")
528
529 }else{
530 print("两个实例不相等")
531 }