首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当AppStorage变量为0时,如何重置@AppStorage数据?

当AppStorage变量为0时,如何重置@AppStorage数据?
EN

Stack Overflow用户
提问于 2022-08-02 12:19:07
回答 2查看 384关注 0票数 -1
代码语言:javascript
复制
import SwiftUI

struct characterDetail: View {
    
    @AppStorage("USER_HEALTH") var userHealth = 100
    @AppStorage("GOLD") var gold = 100
    @AppStorage("USER_PRESTIGE") var userPrestige = 0
    @AppStorage("USER_GLORY") var userGlory = 0
    @AppStorage("USER_ARMOR") var userArmor = 0
    @AppStorage("USER_SPEED") var userSpeed = 0
    @AppStorage("USER_DAMAGE") var userDamage = 0
    

    
    var body: some View {
        VStack{
            ZStack{
                Rectangle()
                    .fill(.gray.opacity(0.1))
                    .cornerRadius(20)
                HStack{
                    Image("character")
                        .resizable()
                        .frame(width: 100, height: 100)

                    VStack(alignment: .leading) {
                        Text("Character Stats")
                            .bold()
                        Text("Health: \(userHealth)")
                            
                        Text("Gold: \(gold)")
                           
                        Text("Prestige: \(userPrestige)")
                        
                        Text("Glory: \(userGlory)")
                            
                    }
                    .offset(x:0, y:-10)
                }
            
            }
        }
        .frame(width: 350, height: 200)
    }
}

每次我完成任务,用户的健康就会下降。当它达到0时,我想重置所有变量。或者当你第一次构建的时候,应用程序就会恢复到第一个形状。

一个重新启动功能的游戏,我试图做一些人,但我做不到,我希望我会找到我想要的。谢谢你的帮助。

代码语言:javascript
复制
import SwiftUI

struct firstMissionButton: View {
    @AppStorage("USER_HEALTH") var userHealth = 100
    @State private var countDownTimer = 5
    @State private var timerRuning = false
    private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var body: some View {
        VStack{
            
            Button(action:{
                timerRuning = true
                userHealth -= 20
            } ){
                Text("GO! Mission Time: \(countDownTimer) sec.")
            }.onReceive(timer){_ in
                if countDownTimer > 0 && timerRuning {
                    countDownTimer -= 1
                }
                else {
                    timerRuning = false
                    countDownTimer = 5
            }
            }.disabled(timerRuning)
        }
    }
}

struct firstMissionButton_Previews: PreviewProvider {
    static var previews: some View {
        firstMissionButton()
    }
}

这就是我改变userHealth的地方。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-02 12:49:27

我建议对您的@AppStorage的密钥使用枚举。这还将为@Appstorage中的@Appstorage声明中的键入提供某种安全性。

代码语言:javascript
复制
enum UserKeys: String, CaseIterable{
    case health = "USER_HEALTH"
    case gold = "GOLD"
    case prestige = "USER_PRESTIGE"
    case glory = "USER_GLORY"
    case armor = "USER_ARMOR"
    case speed = "USER_SPEED"
    case damage = "USER_DAMAGE"
}

然后为UserDefaults创建一个扩展名,该扩展名完全删除以下键:

代码语言:javascript
复制
extension UserDefaults {
    func resetUser(){
        UserKeys.allCases.forEach{
            removeObject(forKey: $0.rawValue)
        }
    }
}

用法:

代码语言:javascript
复制
@AppStorage(UserKeys.health.rawValue) var userHealth = 100
@AppStorage(UserKeys.gold.rawValue) var gold = 100
@AppStorage(UserKeys.prestige.rawValue) var userPrestige = 0
@AppStorage(UserKeys.glory.rawValue) var userGlory = 0
@AppStorage(UserKeys.armor.rawValue) var userArmor = 0
@AppStorage(UserKeys.speed.rawValue) var userSpeed = 0
@AppStorage(UserKeys.damage.rawValue) var userDamage = 0

要删除的功能是:

代码语言:javascript
复制
UserDefaults.standard.resetUser()

最好检查一下userHealth == 0,并在减少它的地方调用removeUser函数。但在代码示例中没有显示这一点。

编辑:

应该是这样的,但是如果不知道逻辑的其余部分,很难确定在userHealth低于或为零之后,计时器是否应该执行:

代码语言:javascript
复制
Button(action:{
    
    userHealth -= 20
    if userHealth <= 0{
        UserDefaults.standard.resetUser()
        return
    }

    timerRuning = true
}

备注:

这只是一种预感,与问题无关,但我认为最好将操作健康状况属性的代码移到timer激发函数的else子句中。

票数 1
EN

Stack Overflow用户

发布于 2022-08-02 12:25:41

我认为它已经在这里发布了,但是尝试下面的功能:

代码语言:javascript
复制
extension UserDefaults {
    func resetDefaults() {
        let dictionary = self.dictionaryRepresentation()
        dictionary.keys.forEach({self.removeObject(forKey: $0})
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73207435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档