思路
使用 SwiftUI 建立 UI 結構;
使用 swift 的列舉和結構體實現資料生成,通過 viewModel 整合資料用於展示(互動暫時未做,因此不涉及 MVVM 設計模式中的資料繫結)。
效果圖
畫布實時預覽 iphone 效果圖:
執行 iphone11 黑暗模式效果圖:
執行 ipad air 模擬器效果圖:
相關程式碼解析
列舉建立撲克牌號碼
//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)"
}
}
}
列舉建立撲克牌型別
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邏輯
struct GameVM {
/// 宣告為 private,符合封裝的思想,通過方法初始化時,必須是類方法(static func)!如果用例項方法,建立例項時,屬性還未初始化,不符合語法!
private var model:GameM = generateGame()
//陣列的泛型不能直接宣告為 Card 型別,會提示找不到。需要通過結構體名點出來!
var cards: Array<GameM.Card> {
return model.cards
}
static func generateGame()->GameM{
var lArr: Array<GameM.Card> = Array<GameM.Card>()
//兩個迴圈就建立好了資料來源,"很快啊!"
for type in CardType.allCases {
for rank in Rank.allCases{
lArr.append(GameM.Card(rank: rank, type:type))
}
}
return GameM(cards: lArr)
}
}
UI實現
/// 宣告式UI程式設計,"很快啊!"
struct ContentView: View {
var viewModel: GameVM
var body: some View {
let columnNum = 4
let rowNum = viewModel.cards.count/columnNum
return
HStack{
ForEach(0..<columnNum){column in
VStack{
ForEach(0..<rowNum){row in
let index = (rowNum) * column + row
let card = viewModel.cards[index]
Card(cardM:card)
}
}
}
}.padding()
}
}
原始碼
感受
swift 語法在構建資料型別時比 OC 方便太多了,列舉和結構體(值型別,copy-on-write)都很強大。
非共享資料優先使用結構體,類一般只用於 viewModel,用於資料共享給多個 view。
SwiftUI 使用宣告式方法構建 UI,程式碼方面簡潔了很多,一套程式碼,三端適用(iOS,iPadOS,macOS(M1))。而且支援實時預覽,大大提高了 UI 開發效率!
距離 APP 支援最低版本 iOS13 應該也不遠了(微信目前最低支援 iOS11.0),iOSer 們,是時候學習一波 SwiftUI 了!隨便再溫習下 swift 相關語法。
展望未來,iOSer 們實現需求起來,終於可以大喊:"很快啊!"
自娛自樂:
剛才有個朋友問我,"OC老師"發生什麼事了,我說怎麼回事,給我發了幾張截圖,我一看,嗷,原來是昨天,有兩個年輕人,實現需求,一個用時九十多分鐘,一個用時八十多分鐘......
但是沒關係啊,我兩百分多鐘以後,需求也做好了。我說 Kotlin 你不講武德,你不懂,他說 "OC 老師"對不起,我不懂,我亂打的,後來他說他練過三四年 Java,看來是有 bear 而來,這個年輕人不講發德,來,騙,來,偷襲,我二十九歲+的老同志,這好嗎?這不好,我勸,這位年輕人好自為之,好好反思,以後不要再犯這樣的錯誤,小聰明啊,開發要以和為貴,要講發德,不要搞窩裡鬥,謝謝朋友們。
歡迎掃描下面二維碼,關注我,謝謝!