ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020最新斯坦福大学ios-swift教程-第二课

2021-02-15 12:32:25  阅读:218  来源: 互联网

标签:第二课 pairIndex ios scene window 2020 var model card


笔者之前观看的是2017版斯坦福swift教程,今天来更新2020版最新的教程
第二课——讲述使用swiftUI,使用MVVM模式进行构建
下面上代码,代码中有注释,当然也可以留言交流

//
//  ContentView.swift
//  Memorize
//
//  Created by 王@@ on 2021/2/6.
//
//MVVM中的view
import SwiftUI

struct ContentView: View {
    //这里定义viewModel去访问viewModel
    var viewModel: EmojiMemoryGame
    
    var body: some View {
        VStack{
            
         HStack {
            ForEach(viewModel.cards) { card in
                //此处可以对卡牌的选择意图进行反馈
                CardView(card: card).onTapGesture{
                    self.viewModel.choose(card: card)
                }
            }
         }}
            .foregroundColor(.orange)
            .padding()
            .font(.largeTitle)
//          .overlay(Circle().stroke(Color.white, lineWidth: 3))
            .shadow(radius: 5)
    }
}

struct CardView: View {
    var card: MemoryGame<String>.Card
    
    var body: some View {
        ZStack()  {
            if card.isFaceUp{
            RoundedRectangle(cornerRadius:10.00).fill(Color.white)
            RoundedRectangle(cornerRadius: 10.00).stroke(lineWidth: 3)
            Text(card.concent)
            }else{
            RoundedRectangle(cornerRadius:10.00).fill()
            }
        }
    }
}






struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(viewModel: EmojiMemoryGame())
    }
}
 

//
//  MemoryGame.swift
//  Memorize
//
//  Created by 王@@ on 2021/2/13.
//
//MVVM中的model

import Foundation

struct MemoryGame<CardConcent> {
    var cards: Array<Card>
    
    func choose(card: Card){
        print("card chosen: \(card)")
    }
    //接收到卡牌对的传参之后进行一个初始化,并且将回调一个方法型的参数,这个方法型的参数传一个int类型的数字,告诉viewmodel,是哪组卡牌对需要进行初始化,这时viewmodel只需要返回一个CardConcent给model进行初始化即可
    init(numberOfPairsOfCards: Int, cardConteneFactory: (Int) -> CardConcent) {
        //创建一个空的纸牌阵列
        cards = Array<Card>()
        //遍历卡牌对,创建卡牌队列
        for pairIndex in  0..<numberOfPairsOfCards{
            let content = cardConteneFactory(pairIndex)
            cards.append(Card( concent: content, id: pairIndex*2))
            cards.append(Card( concent: content, id: pairIndex*2+1))
 
        }
        
    }
    //Identifiable是可迭代事物协议,添加这个协议swift才可以识别卡牌并且迭代 
    struct Card: Identifiable {
        //三个变量,是否正面朝上、是否被匹配、内容(这里使用MemoryGame的通用类型CardConcent,因为与ui分离,这里可以放入任何想放入的东西)
        var isFaceUp: Bool = true
        var isMatched: Bool = false
        var concent: CardConcent
        var id: Int

    }
}

``


```swift
//
//  EmojiMemoryGame.swift
//  Memorize
//
 //
//MVVM中的view model,实现用户的意图,向view展示model

import SwiftUI

//func creatCardContent(pairIndex: Int) -> String{
//    return "

标签:第二课,pairIndex,ios,scene,window,2020,var,model,card
来源: https://blog.csdn.net/qq_36711094/article/details/113814977

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有