Swift基本语法及与OC比较之二

  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 }