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

移动开发 作者: 2024-08-24 18:25:01
思路 使用 SwiftUI 创建 UI 结构; 使用 swift 的枚举和结构体实现数据生成,通过 viewModel 整合数据用于展示(交互暂时未做,因此不涉及 MVVM 设计模式中的数据绑定)。

枚举创建扑克牌号码

//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()
    }
}
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_67960.html