这篇文章介绍了在SwiftUI中使用UserDefault存储数据的方法。作者通过添加@State属性来存储用户的分数,并在标志下方的标签中显示玩家的当前得分。他还介绍了如何设置UserDefault的默认值来保证数据的一致性。最后,作者提供了一个走迷宫的右手定则的SwiftPlayground来进行练习。
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
投诉项目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
|
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() } }
|
SwiftPlayground 进度
这关用的走迷宫的右手定则方式,出奇的好用