swift 应用程序在保存到UserDefaults时总是崩溃

7z5jn7bk  于 2023-06-21  发布在  Swift
关注(0)|答案(5)|浏览(121)

我不知道什么是错的:

extension UserDefaults {

    static let shared = UserDefaults(suiteName: SharedGroupName)!

    static func set(object: Any, forKey key: String) {
    
        shared.set(object, forKey: key)
        shared.synchronize()
    }
}

IDE中的错误图像:

aamkag61

aamkag611#

你应该试着省略静态变量,只用途:

UserDefaults(suiteName: SharedGroupName)!.set(object, forKey: key)

可能会有不同。此外,正如其中一条评论所述,不需要“同步”。

5w9g7ksd

5w9g7ksd2#

我重新创建了相同的源代码,它没有崩溃,我相信崩溃是由你给的示例文件之外的东西造成的。您能否添加更多可能向扩展传递数据的代码?

kdfy810k

kdfy810k3#

只需将shared声明为可选即可。

static var shared: UserDefaults? = UserDefaults(suiteName: SharedGroupName)
c3frrgcw

c3frrgcw4#

extension UserDefaults {

    static let shared = UserDefaults(suiteName: SharedGroupName! as String)

    static func set(object: Any, forKey key: String) {

        shared?.set(object, forKey: key)
        // shared?.synchronize()  obsolete
    }
}

1.打开SharedGroupName!作为字符串
1.使用可选的"?“与共享将运行您的代码罚款

zphenhs4

zphenhs45#

  • 您确定需要使用非默认的UserDefault并使用特定的suiteName吗?

如果答案是肯定的,并且原因是您正在使用小部件扩展,请确保主应用目标和小部件扩展目标都启用了应用组功能,并使用相同的已激活(必须设置复选标记)应用组名称。
如果答案是否定的,那么用suiteName替换init并使用默认的初始化器。

  • 强制解包SharedGroupName!我觉得选角不太合适

static let shared = UserDefaults(suiteName: SharedGroupName! as String)
能否尝试直接传递SharedGroupName的字符串值?

相关问题