1. 程式人生 > >SwiftUI:看我展示52張撲克牌,“很快啊!”

SwiftUI:看我展示52張撲克牌,“很快啊!”

[toc] ## 思路 使用 SwiftUI 建立 UI 結構; 使用 swift 的列舉和結構體實現資料生成,通過 viewModel 整合資料用於展示(互動暫時未做,因此不涉及 MVVM 設計模式中的資料繫結)。 ## 效果圖 畫布實時預覽 iphone 效果圖: ![截圖2020-11-20 下午6.00.37](https://tva1.sinaimg.cn/large/0081Kckwgy1gkvsw2rpz3j31au0u0k6l.jpg) 執行 iphone11 黑暗模式效果圖: ![Simulator Screen Shot - iPhone 11 - 2020-11-25 at 11.25.13](https://tva1.sinaimg.cn/large/0081Kckwgy1gl199t4gfgj30n01ds79k.jpg) 執行 ipad air 模擬器效果圖: ![Simulator Screen Shot - iPad Air (4th generation) - 2020-11-23 at 11.42.50](https://tva1.sinaimg.cn/large/0081Kckwgy1gkyymnzmabj30u0176n3l.jpg) ## 相關程式碼解析 ### 列舉建立撲克牌號碼 ```swift //CaseIterable:當需要對列舉進行遍歷時,需要遵守 CaseIterable 協議,然後對列舉的 allCases 類屬性進行遍歷即可 enum Rank:Int, CaseIterable { case ace = 1 //未指定確定值的類別,預設值是“依次”加1,因此,two 的 rawValue 為2,three 的 rawValue 為 3,以此類推 case two,three,four,five,six,seven,eight,nine,ten case J,Q,K //swift的列舉,可以自定義方法。寫程式碼時,“很快啊!” func customDescription()->String{ switch self { case .ace: return "A" case .J: return "J" case .Q: return "Q" case .K: return "K" default: return "\(self.rawValue)" } } } ``` ### 列舉建立撲克牌型別 ```swift enum CardType: CaseIterable{ case heart,spades,club,diamond func customDescription() -> String { switch self { case .heart: //command+ctrl+space,快速調出 emoji 視窗,可以搜尋,"很6啊!" return "♥️" case .spades: return "♠️" case .club: return "♦️" default: return "♣️" } } } ``` ### viewModel邏輯 ```swift struct GameVM { /// 宣告為 private,符合封裝的思想,通過方法初始化時,必須是類方法(static func)!如果用例項方法,建立例項時,屬性還未初始化,不符合語法! private var model:GameM = generateGame() //陣列的泛型不能直接宣告為 Card 型別,會提示找不到。需要通過結構體名點出來! var cards: Array { return model.cards } static func generateGame()->GameM{ var lArr: Array = Array() //兩個迴圈就建立好了資料來源,"很快啊!" for type in CardType.allCases { for rank in Rank.allCases{ lArr.append(GameM.Card(rank: rank, type:type)) } } return GameM(cards: lArr) } } ``` ### UI實現 ```swift /// 宣告式UI程式設計,"很快啊!" struct ContentView: View { var viewModel: GameVM var body: some View { let columnNum = 4 let rowNum = viewModel.cards.count/columnNum return HStack{ ForEach(0..
自娛自樂: > > 剛才有個朋友問我,"OC老師"發生什麼事了,我說怎麼回事,給我發了幾張截圖,我一看,嗷,原來是昨天,有兩個年輕人,實現需求,一個用時九十多分鐘,一個用時八十多分鐘...... > > 但是沒關係啊,我兩百分多鐘以後,需求也做好了。我說 Kotlin 你不講武德,你不懂,他說 "OC 老師"對不起,我不懂,我亂打的,後來他說他練過三四年 Java,看來是有 bear 而來,這個年輕人不講發德,來,騙,來,偷襲,我二十九歲+的老同志,這好嗎?這不好,我勸,這位年輕人好自為之,好好反思,以後不要再犯這樣的錯誤,小聰明啊,開發要以和為貴,要講發德,不要搞窩裡鬥,謝謝朋友們。 歡迎掃描下面二維碼,關注我,謝謝! ![qrcode_for_gh_b4657e673349_258](https://tva1.sinaimg.cn/large/0081Kckwgy1gl1hdxlp38j30760767