项目2的挑战部分,增加了存储部分的挑战。

挑战

最好的学习方法之一是尽可能频繁地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情:

  • 添加一个@State属性来存储用户的分数,在答案正确与否时对其进行修改,然后将其显示在警报中。
  • 在标志正下方的标签中显示玩家的当前得分。
  • 如果有人选择了错误的标志,请在你的警报消息中告诉他们他们的错误-诸如“错误!那就是法国的国旗。”
  • 【新增】存储分数数据
  • 【新增】默认用户拥有100分

使用UserDefault存储

存储数据

UserDefaults.standard.set(self.tapCount, forKey: “Tap”)

读取数据

@State private var tapCount = UserDefaults.standard.integer(forKey: "Tap")

初始化程序

初始化程序是为这个结构一个初始值。我们可以使用init方法来初始化程序,在之前不需要加func,但是必须要包含所有的参数:

1
2
3
4
5
6
7
8
9
10
struct Zhhoo {
var url: String
init(){
url = "zhhooo.com"
print("default: \(url)")
}
}

var adr = Zhhoo()
adr.url = "blog.zhhooo.com"

设置UserDefault的默认值

UserDefaults.standard.register(defaults: ["score": 100])

参考链接:官方文档

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//
// ContentView.swift
// Practise2-3
//
// Created by 张洪Hoo on 2020/3/31.
// Copyright © 2020 张洪Hoo. All rights reserved.
//

import SwiftUI

struct ContentView: View {
@State private var counryList = ["Estonia", "France", "Germany", "Ireland", "Italy", "Nigeria", "Poland", "Russia", "Spain", "UK", "US"].shuffled()
@State private var question = Int.random(in: 0...2)
@State private var option = [String]()
@State private var showAlert = false

@State private var alertTitle = "猜对了!"
@State private var alertDescription = "当前分数为 ???"

@State private var score = UserDefaults.standard.integer(forKey: "score") //分数


var body: some View {
ZStack {

LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 0.1017264351, green: 0.2405829132, blue: 0.8561289907, alpha: 1)), Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))]), startPoint: .top, endPoint: .bottom)
.edgesIgnoringSafeArea(.all)


VStack {
Text("选择这个国家的国旗")
.foregroundColor(Color.white)
Text("\(self.counryList[self.question])")
.font(.largeTitle)
.bold()
.foregroundColor(Color.white)
ForEach(0 ..< 3, id: \.self) { item in
Button(action: {
if item == self.question {
self.alertTitle = "猜对了!"
self.score += 2 //猜对加两分
UserDefaults.standard.set(self.score, forKey: "score") //存储分数
self.alertDescription = "当前分数为:\(self.score)"
self.showAlert = true

}else {
self.alertTitle = "猜错了!"
self.score += -1 //猜错扣一分
UserDefaults.standard.set(self.score, forKey: "score")
self.alertDescription = "你选择的是\(self.counryList[item]),当前分数为:\(self.score)"
self.showAlert = true
}
}) {
Image(self.counryList[item])
.renderingMode(.original)
.clipShape(Capsule())

}
.padding()

}


Spacer()
Text("当前分数为:\(self.score)")
.foregroundColor(.white)
}

}

.alert(isPresented: $showAlert){
Alert(---
title: Text(alertTitle), message: Text(alertDescription), dismissButton: .default(Text("继续")){
self.askQuestion()


})

}
}

func askQuestion() {
counryList.shuffle()
question = Int.random(in: 0...2)

}

init(){
UserDefaults.standard.register(defaults: ["score": 100])
}
}

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

1791

SwiftPlayground 进度

这关用的走迷宫的右手定则方式,出奇的好用

1792