日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 數組排序

1.1 問題

本案例實現一個整型數組排序的函數,數組排序的規則由傳遞的規則函數決定。

1.2 方案

首先定義一個整型數組排序函數sortInts,該函數有一個整型數組類型的參數,該參數必須是輸入輸出參數inout,否則并不能修改數組的值。另外還有一個(Int,Int)->Bool函數類型的參數rule,該參數用于提供數組的排序規則。

然后實現函數sortInts,這里采用數組的冒泡排序算法來實現排序。

接下來實現一個數組排序的規則函數rule1,該函數是(Int,Int)->Bool類型,可以將該函數設置為sortInts函數rule1規則的默認值。

最后將一個整型數組a,傳遞給函數調用,就能實現數組a的排序。當然也可以自定義規則傳遞給函數sortInts。

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:定義整型數組排序函數sortInts

首先定義一個整型數組排序函數sortInts,該函數有一個整型數組類型的參數,該參數必須是輸入輸出參數inout,否則并不能修改數組的值。另外還有一個(Int,Int)->Bool函數類型的參數rule,該參數用于提供數組的排序規則,代碼如下所示:

  1. funcsortInts(inout data:[Int],rule:(Int,Int)->Bool)?{
  2. }

然后實現函數sortInts,這里采用數組的冒泡排序算法來實現排序,代碼如下所示:

  1. funcsortInts(inout data:[Int],rule:(Int,Int)->Bool)?{
  2. forvari=0;i?< data.count-1;i++?{
  3. forvar j=0;j<data.count-i-1;j++?{
  4. if?rule(data[j], data[j+1])?{
  5. swap(&data[j],?&data[j+1])
  6. }
  7. }
  8. }
  9. }

步驟二:實現規則函數

sortInts函數的rule參數是一個函數類型,需要調用時進行傳遞,該參數用于決定數組的排序規則,可以進行自定義,也就是由程序員來根據程序需求自定義排序規則。

接下來實現一個數組排序的規則函數rule1,該函數是(Int,Int)->Bool類型,可以將該函數設置為sortInts函數rule1規則的默認值,代碼如下所示:

  1. func?rule1(a:Int,b:Int)->Bool?{
  2. return a?> b
  3. }
  4. //函數類型作為參數傳遞
  5. funcsortInts(inout data:[Int],rule:(Int,Int)->Bool?= rule1)?{
  6. forvari=0;i?< data.count-1;i++?{
  7. forvar j=0;j<data.count-i-1;j++?{
  8. if?rule(data[j], data[j+1])?{
  9. swap(&data[j],?&data[j+1])
  10. }
  11. }
  12. }
  13. }

最后將一個整型數組a,傳遞給函數調用,使用默認規則實現數組a的排序,代碼如下所示:

  1. var a?=?[1,3,2,4,9,8,5,0,6,7]
  2. sortInts(&a)

運行結果如圖-1所示:

圖-1

當然也可以自定義規則傳遞給函數sortInts,代碼如下所示:

  1. //自定義排序規則
  2. func?rule2(a:Int,b:Int)->Bool?{
  3. return a<b
  4. }
  5. sortInts(&a, rule: rule2)
  6. func?rule3(a:Int, b:Int)->Bool?{return a%3?> b%3}
  7. sortInts(&a, rule: rule3)

運行結果如圖-2所示:

圖-2

1.4 完整代碼

本案例中,完整代碼如下所示:

  1. importUIKit
  2. func?rule1(a:Int,b:Int)->Bool?{
  3. return a?> b
  4. }
  5. //函數類型作為參數傳遞
  6. funcsortInts(inout data:[Int],rule:(Int,Int)->Bool?= rule1)?{
  7. forvari=0;i?< data.count-1;i++?{
  8. forvar j=0;j<data.count-i-1;j++?{
  9. if?rule(data[j], data[j+1])?{
  10. swap(&data[j],?&data[j+1])
  11. }
  12. }
  13. }
  14. }
  15. var a?=?[1,3,2,4,9,8,5,0,6,7]
  16. sortInts(&a)
  17. a
  18. //自定義排序規則
  19. func?rule2(a:Int,b:Int)->Bool?{
  20. return a<b
  21. }
  22. sortInts(&a, rule: rule2)
  23. func?rule3(a:Int, b:Int)->Bool?{return a%3?> b%3}
  24. sortInts(&a, rule: rule3)
?

2 將Int數組轉換為對應的String類型的數組

2.1 問題

如果需要將一個很長的閉包表達式作為最后一個參數傳遞給函數,可以使用尾隨閉包來增強函數的可讀性。本案例在Array的map方法中使用尾隨閉包將一個Int類型的數組[16, 58, 510]轉換為對應的String類型的數組["一六", "五八", "五一零"]。

2.2 方案

Array類型有一個map方法,唯一參數是一個閉包表達式,數組中的每一個元素調用用一次該閉包函數,并返回該元素所映射的值,具體的映射方式由閉包表達式決定。

當提供給數組閉包函數后,map方法將返回一個新的數組,數組中包含了與原數組一一對應的映射后的值。

2.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建字典digiNames

創建一個數字和中文名映射的字典digiNames,代碼如下所示:

  1. letdigitNames?=?[
  2. 0:?"零",?1:?"一",?2:?"二",?3:?"三",?4:?"四",5:?"五",?6:?"六",?7:?"七",?8:?"八",?9:?"九"]
  3. let numbers?=?[16,?58,?510]

步驟二:調用map方法

numbers數組調用map方法,該方法需要傳遞一個閉包表達式用于規定映射規則,這里采用尾隨閉包的形式,代碼如下所示:

  1. numbers.map?{(var number)?->?String?in
  2. var output?=?""
  3. while number?>?0?{
  4. //字典下標返回一個可選值
  5. output?= digitNames[number?%?10]!?+ output
  6. number?/=?10
  7. }
  8. return output
  9. }

map函數是數組的方法,可以迭代數組中每一元素傳入閉包執行一次,并將執行后的結果做成一個數組返回回來,運行結果如圖-3所示:

圖-3

2.4 完整代碼

本案例中,完整代碼如下所示:

  1. importUIKit
  2. letdigitNames?=?[
  3. 0:?"零",?1:?"一",?2:?"二",?3:?"三",?4:?"四",5:?"五",?6:?"六",?7:?"七",?8:?"八",?9:?"九"]
  4. let numbers?=?[16,?58,?510]
  5. //map函數是數組的方法,可以迭代數組中每一元素傳入閉包執行一次,并將執行后的結果做成一個數組返回回來
  6. let strings?= numbers.map?{(var number)->String?in
  7. var output?=?""
  8. while number?>?0?{
  9. output?= digitNames[number%10]!+output
  10. number/=10
  11. }
  12. return output
  13. }
  14. strings
?

3 定義商品條形碼的枚舉

3.1 問題

假設一個倉庫跟蹤系統需要利用兩種不同類型的條形碼來跟蹤商品,有些商品上標有UPC-A格式的一維碼,它是由三個整型數字組成。另外其他一些商品上標有QR格式的二維碼,它是一個字符串,如圖-4、圖-5所示:

圖-4

圖-5

本案例要求使用枚舉來表示商品條碼并設置其關聯值。

3.2 方案

首先把UPC-A碼作為三個整型值的元組,把QR碼作為一個任字符串存儲起來,那么定義一個枚舉Barcode并設置器關聯值。

3.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:定義枚舉Barcode

定義一個枚舉Barcode表示商品條形碼,它有兩個成員UPCA和QRCode,UPCA的關聯值是一個包含三個整型值的元組類型,QRCode的關聯值是一個String類型,代碼如下所示:

  1. enum Barcode{
  2. case?UPCA(Int, Int, Int)
  3. caseQRCode(String)
  4. }

枚舉的定義不提供任何Int或String的實際值,只是定義而已。

步驟二:使用關聯值

使用剛才定義的枚舉類型Barcode創建一個新的變量productBarcode,并且賦給它兩個成員的關聯值,代碼如下所示:

  1. varproductBarCode?: Barcode?= Barcode.UPCA(692,?530372375,?0)
  2. productBarCode?= Barcode.QRCode("ABCDEFSFD")

不同的條形碼可以使用一個switch語句來檢查,代碼如下所示:

  1. switchproductBarCode?{
  2. case?.UPCA(let(num, id, check)):
  3. println("這是條形碼\(num)-\(id)-\(check)")
  4. case?.QRCode(let pCode):
  5. println("這是二維碼\(pCode)")
  6. }

然后調用函數,運行結果如圖-6所示:

圖-6

3.4 完整代碼

本案例中,完整代碼如下所示:

  1. importUIKit
  2. //關聯值
  3. enum Barcode{
  4. case?UPCA(Int, Int, Int)
  5. caseQRCode(String)
  6. }
  7. varproductBarCode?: Barcode?= Barcode.UPCA(692,?530372375,?0)
  8. productBarCode?= Barcode.QRCode("ABCDEFSFD")
  9. switchproductBarCode?{
  10. case?.UPCA(let(num, id, check)):
  11. println("這是條形碼\(num)-\(id)-\(check)")
  12. case?.QRCode(let pCode):
  13. println("這是二維碼\(pCode)")
  14. }
?

4 定義幾何形狀的結構體

4.1 問題

屬性分為存儲屬性和計算屬性,存儲屬性就是用常量或變量保存的屬性值。計算屬性的值是通過計算得出的。

按如下要求完成本案例:

1)定義一個Point結構體,用于表示點坐標(x,y);

2)定義一個Size結構體,用于表示形狀的長和寬(width,height);

3)定義一個Rect結構體,用于表示有原點和尺寸的矩形,還提供一個表示中心點center的計算屬性;

4)創建一個Rect類型的實例square,并設置和修改center屬性移動矩形,如圖-7所示:

圖-7

4.2 方案

首先定義Point結構體和Size結構體,Point結構有兩個存儲屬性x和y,用于表示點坐標。Size結構體也有兩個存儲屬性width和height,用于表示長寬。

然后定義矩形Rect結構體,該結構體有兩個存儲屬性一個是Point類型的origin,用于表示原點坐標,另一個是Size類型的size,用于表示矩形的長寬。

Rect結構體還有一個Point類型的計算屬性center,用于表示矩形的中心點,需要提供getter和setter方法獲取和設置其值。

最后創建一個Rect實例square,設置和修改center屬性,查看輸出結果。

4.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:定義Point和Size結構體

首先定義Point結構體和Size結構體,Point結構有兩個存儲屬性x和y,用于表示點坐標。Size結構體也有兩個存儲屬性width和height,用于表示長寬,代碼如下所示:

  1. struct Point?{
  2. //存儲屬性
  3. var x?=?0.0
  4. var y?=?0.0
  5. }
  6. struct Size?{
  7. ?????//存儲屬性
  8. var width?=?0.0
  9. var height?=?0.0
  10. }

步驟二:定義Rect結構體

然后定義矩形Rect結構體,該結構體有兩個存儲屬性一個是Point類型的origin,用于表示原點坐標,另一個是Size類型的size,用于表示矩形的長寬,代碼如下所示:

  1. structRect?{
  2. //存儲屬性
  3. var origin?=?Point()
  4. var size?=?Size()
  5. }

Rect結構體還有一個Point類型的計算屬性center,用于表示矩形的中心點,需要提供getter和setter方法獲取和設置其值,代碼如下所示:

  1. structRect?{
  2. //存儲屬性
  3. var origin?=?Point()
  4. var size?=?Size()
  5. //計算屬性
  6. varcenter:Point?{
  7. get?{
  8. letcenterX?= origin.x?+ size.width/2
  9. letcenterY?= origin.y?+ size.height/2
  10. return?Point(x: centerX, y: centerY)
  11. }
  12. set(newCenter)?{
  13. origin.x?= newCenter.x?- size.width/2
  14. origin.y?= newCenter.y?- size.height/2
  15. }
  16. }
  17. }

步驟三:創建square實例

創建一個Rect實例square,原點坐標設置為(0.0,0.0),長寬設置為(10.0,10.0),可以通過點運算調用getter方法獲取到center屬性的值,代碼如下所示:

  1. var square?=?Rect(origin:?Point(x:?0.0, y:?0.0), size:?Size(width:?10.0, height:?10.0))
  2. letcenterSquare?= square.center

可以看到center的值為(5.0,5.0),運行結果如圖-8所示:

圖-8

然后重新設置center的值(15,15),設置屬性center的值會調用setter來修改該屬性origin的值,代碼如下所示:

  1. square.center?=?Point(x:?15, y:?15)

可以看到此時square的origin屬性的值為(10,10),運行結果如圖-9所示:

圖-9

4.4 完整代碼

本案例中,完整代碼如下所示:

  1. importUIKit
  2. struct Point?{
  3. //存儲屬性
  4. var x?=?0.0
  5. var y?=?0.0
  6. }
  7. struct Size?{
  8. //存儲屬性
  9. var width?=?0.0
  10. var height?=?0.0
  11. }
  12. structRect?{
  13. //存儲屬性
  14. var origin?=?Point()
  15. var size?=?Size()
  16. //計算屬性
  17. varcenter:Point?{
  18. get?{
  19. letcenterX?= origin.x?+ size.width/2
  20. letcenterY?= origin.y?+ size.height/2
  21. return?Point(x: centerX, y: centerY)
  22. }
  23. set(newCenter)?{
  24. origin.x?= newCenter.x?- size.width/2
  25. origin.y?= newCenter.y?- size.height/2
  26. }
  27. }
  28. }
  29. var square?=?Rect(origin:?Point(x:?0.0, y:?0.0), size:?Size(width:?10.0, height:?10.0))
  30. letcenterSquare?= square.center
  31. square.center?=?Point(x:?15, y:?15)

轉載于:https://www.cnblogs.com/hytx/p/5053776.html

總結

以上是生活随笔為你收集整理的Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。