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时,我想重置所有变量。或者当你第一次构建的时候,应用程序就会恢复到第一个形状。
一个重新启动功能的游戏,我试图做一些人,但我做不到,我希望我会找到我想要的。谢谢你的帮助。
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的地方。
发布于 2022-08-02 12:49:27
我建议对您的@AppStorage的密钥使用枚举。这还将为@Appstorage中的@Appstorage声明中的键入提供某种安全性。
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创建一个扩展名,该扩展名完全删除以下键:
extension UserDefaults {
func resetUser(){
UserKeys.allCases.forEach{
removeObject(forKey: $0.rawValue)
}
}
}用法:
@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要删除的功能是:
UserDefaults.standard.resetUser()最好检查一下userHealth == 0,并在减少它的地方调用removeUser函数。但在代码示例中没有显示这一点。
编辑:
应该是这样的,但是如果不知道逻辑的其余部分,很难确定在userHealth低于或为零之后,计时器是否应该执行:
Button(action:{
userHealth -= 20
if userHealth <= 0{
UserDefaults.standard.resetUser()
return
}
timerRuning = true
}备注:
这只是一种预感,与问题无关,但我认为最好将操作健康状况属性的代码移到timer激发函数的else子句中。
发布于 2022-08-02 12:25:41
我认为它已经在这里发布了,但是尝试下面的功能:
extension UserDefaults {
func resetDefaults() {
let dictionary = self.dictionaryRepresentation()
dictionary.keys.forEach({self.removeObject(forKey: $0})
}
}https://stackoverflow.com/questions/73207435
复制相似问题