2020最新斯坦福大学ios-swift教程-第三课(上)-反应式操作

6 篇文章 0 订阅

笔者之前观看的是2017版斯坦福swift教程,今天来更新2020版最新的教程
第三课(上)——讲述swiftUI的反应式操作(之所以拆分为两部分是由于第三课的两部分教程没有很大的关联性所以分步来展示代码)
下面上代码,代码中有注释,当然也可以留言交流

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

struct EmojiMemoryGameView: View {
    //这里定义viewModel去访问viewModel
    //视图在published发布后,即接收广播后,进行更新
    @ObservedObject 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(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 {
        EmojiMemoryGameView(viewModel: EmojiMemoryGame())
    }
}
 

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

import SwiftUI

//func creatCardContent(pairIndex: Int) -> String{
//    return "😀"
//}
//(pairIndex: Int) -> String  in "😀" 等价于 pairIndex  in "😀"
//设置ObservableObject约束
class EmojiMemoryGame: ObservableObject{
    //model是一个称呼,model确定model- MemoryGame的使用类型,可以通过定义一个自己的cards 去返回已经被private保护的model的cards
    //这里给model一个卡牌对的传参,并且接收model的调用去返回一个卡牌内容cardcontent
    //numberOfPairsOfCards: 2, cardConteneFactory: { pairIndex  in "😀"}) 等价于 (numberOfPairsOfCards: 2){ pairIndex  in "😀"}
    //@Published是属性包装器,模型每次每次变化都进行广播
    @Published private var model: MemoryGame<String> = EmojiMemoryGame.createMemoryGame()
    
    static func createMemoryGame() -> MemoryGame<String>{
        
        let emojis = ["👻","🎃","🕷"]
        return MemoryGame<String>(numberOfPairsOfCards: emojis.count){ pairIndex  in
            return emojis[pairIndex]
        }
    }
    
    //MARK: - Access to the model(对model的一些访问)
    
    var cards: Array<MemoryGame<String>.Card>{
        model.cards
    }
    
    //MARK: - Intent(s)一些意图
    
    func choose(card: MemoryGame<String>.Card){
        //请model来选择卡牌
//        //objectWillChange分发
//        objectWillChange.send()
        model.choose(card: card)
    }
    
}

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

import Foundation

struct MemoryGame<CardConcent> {
    var cards: Array<Card>
    
    //mutating代表变异函数,可以修改自身的函数
    mutating func choose(card: Card){
        print("card chosen: \(card)")
        //实现翻转逻辑,这里确定选中的卡牌是阵列中的第几个卡牌,得到一个int类型的返回值并复制给chosenIndex
        let chosenIndex = self.index(of: card)
//        //这里chosenCard即是选中的卡牌
//        let chosenCard :Card = self.cards[chosenIndex]
//        //这里反转卡牌,让选中卡牌的isFaceUp等于反值,因为isFaceUp是一个bool型数值
//        chosenCard.isFaceUp = !chosenCard.isFaceUp
        //与上面等价
        self.cards[chosenIndex].isFaceUp = !self.cards[chosenIndex].isFaceUp
    }
    
    //外部名称of、内部名称card、类型Card
    func index(of card: Card) -> Int{
        for index in 0..<self.cards.count{
            if self.cards[index].id == card.id{
                return index
            }
        }
        return 0 //TODO: gogus!
    }
    //接收到卡牌对的传参之后进行一个初始化,并且将回调一个方法型的参数,这个方法型的参数传一个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

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
斯坦福大学-深度学习基础教程.pdf》是一本由斯坦福大学编写的深度学习基础教程的电子书。深度学习是人工智能领域的一个重要分支,逐渐成为各个领域的研究热点。该教程提供了对深度学习基础知识的系统介绍,旨在帮助读者深入理解深度学习的原理和应用。 这本教程主要包含了深度学习的基本内容,如神经网络、卷积神经网络和循环神经网络等。它从浅显易懂的角度出发,通过图文并茂的方式,对相关概念和算法进行了解释和演示,有助于读者逐步掌握深度学习的基本概念和操作方法。 此外,该教程还提供了一些实践项目,供读者在学习的过程中进行实践和实验。这些项目有助于读者将理论知识应用到实际问题中,加深对深度学习的理解和掌握。 通过阅读这本教程,读者可以了解深度学习在计算机视觉、自然语言处理等领域的应用,并学习如何使用常见的深度学习框架进行模型的训练和部署。此外,该教程还介绍了深度学习在其他领域的研究进展,使读者对深度学习的前沿技术有所了解。 总之,《斯坦福大学-深度学习基础教程.pdf》是一本全面而系统的深度学习入门教材,适合对深度学习感兴趣的学生、研究人员和工程师阅读和学习。它能够帮助读者建立深度学习的基础知识,为深度学习的进一步学习和研究打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值