能够确定自定义的 UserDefault 套件是否存在,在最初创建时启用自定义行为

Ability to determine whether a custom suite of UserDefault exists, enabling custom behaviour when it’s initially created

我正在为 UserDefaults 创建自定义套件:

var store = UserDefaults(suiteName: "custom")

但是我需要根据套件是否已经存在来触发特定的行为。

具体而言,如果 未找到 套件,我希望使用预设 key/value 对对其进行初始化。如果找到了,则无需采取任何特殊措施。在真实场景中,想象一个应用程序最初启动时带有您可以单独删除的预设过滤器(即后续启动指的是过滤器的最新状态,而不是回退到预设)。

我知道我可以通过检查每个预设的可用性来检查 empty 状态,例如:

var found = 0
for key in presetKeys {
    if let _ = UserDefaults(suiteName: "custom")?.object(forKey: key) {
        found += 1
    }
}

if found == 0 {
    // empty suite
}

但是,这没有帮助,因为空状态并不表示第一个 运行。这可能是因为用户删除了自动分配给他们的所有预设。此外,用户可以创建自己的 key/value 对以添加到套件中。他们的密钥是动态生成的,排除了空状态检查(因为我不知道要查找什么密钥)。

总而言之,有没有一种方法可以简单地判断指定名称的套件是否已经存在?

如果是,即使删除了所有 key/value 对,套件是否继续存在?我不希望用户触发的空状态导致套件被永久删除,从而导致应用程序的下一个 运行 自动重新加载预设,因为它混淆了空状态和新状态。

希望这是有道理的!

没有 built-in 方法来检查特定 UserDefaults 套件是否已经存在。

但是,您可以创建一个具有 Bool 值的特殊键,您可以将其用作是否修改了任何预设值的标志。

does the suite continue to exist even when all its key/value pairs were removed?

是的。 UserDefaults 套件不需要保存任何值,它可以是空的。从套件中删除所有值不会影响套件本身的存在。