gpt4 book ai didi

swift - 不安全的可变寻址器崩溃

转载 作者:IT王子 更新时间:2023-10-29 05:38:28 24 4
gpt4 key购买 nike

我有一个struct,有时,对于某些用户来说,在尝试访问该类型的变量时会发生崩溃。

struct AppSettings {
var mute:Bool {
didSet {
if mute != oldValue {
let savedSettings = NSUserDefaults.standardUserDefaults()
savedSettings.setBool(mute, forKey: KEY_SETTING_MUTE)
}
}
}

init() {
let savedSettings = NSUserDefaults.standardUserDefaults()
if let savedMute = savedSettings.objectForKey(KEY_SETTING_MUTE) as? Bool {
mute = savedMute
} else {
mute = false
}
}

}
var appSettings = AppSettings()

在应用程序启动期间的某个地方有时会崩溃

if appSettings.mute {  // This will sometimes cause a crash
} // in AppDelegate or the methods it calls

这仅适用于某些用户,我似乎无法复制它。不能重现它是最糟糕的,因为它让我无事可做。

搜索 unsafe mutable addressor 作为错误没有帮助,因为几乎没有结果。

最佳答案

我认为您的解决方案设计过度,难以理解或调试。几年来,我一直在我的应用程序中使用类似的解决方案来管理 session 状态,并希望与您分享。您可以从这里直接提出并实现并且没有任何问题。

我在 Session 原则上工作,这意味着我希望存储和读取的值通过一个可靠的 Session 类并且没有错误的余地。

下面是如何在应用程序的任何地方使用它。

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// how to set the value to be stored in userdefaults
Session.HasMuted = true

// two example of how to read the value
if Session.HasMuted == true {
print("has muted")
}

if Session.HasMuted == false {
print("has not muted")
}
}

这是 session 类

class Session {
class var HasMuted: Bool {
get {
guard let HasMuted = UserDefaults.standard.object(forKey: SessionSpace.HasMuted) as? Bool else {
return false
}

return HasMuted
}
set {
UserDefaults.standard.set(newValue, forKey: SessionSpace.HasMuted)
}
}
}

和伴随的 session 空间结构

struct SessionSpace {
static let HasMuted = "HasMuted"
}

我会考虑调整它以适应您的风格,我不太喜欢用大写字母来表示键字符串等,这是一个更优雅的可读性、实现和忘记的解决方案。您可以通过在 session 空间 block 中添加一个 setter/getter block 和 key 字符串来扩展它,并在几秒钟内从应用程序的任何地方再次使用,因为它是无故障且健壮的。如果您需要更多帮助,请告诉我。希望您采用它并将其保存到片段中。

关于swift - 不安全的可变寻址器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43279166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com