我目前正在开发一个 Swift 项目,其中我将默认值注册到两个不同的UserDefaults
套件:标准套件和自定义套件。但是,我发现它们之间存在意外的(可能是正确的)重叠。我尝试在文档中查找有关此问题的信息,但没有找到。
这是我的代码的简化版本:
注意:
com.domain.custom
这不是应用程序包 ID,我只是模仿了没有应用程序组反向域的程序group.
,并使用了与我的应用程序 ID 不同的域
import SwiftUI
@main
struct TestApp: App {
init() {
// Register defaults for standard UserDefaults
UserDefaults.standard.register(defaults: [
"standardA": "Standard A value"
])
// Register defaults for custom UserDefaults with suiteName
if let customUserDefaults = UserDefaults(suiteName: "com.domain.custom") {
customUserDefaults.register(defaults: [
"customA": "Custom A value"
])
}
// Function to print all keys
func printCustomKeys(for userDefaults: UserDefaults) {
let allKeys = userDefaults.dictionaryRepresentation()
print("Custom keys for UserDefaults suite:")
allKeys.forEach { key, value in
print("\(key) = \(value)")
}
}
// Usage
printCustomKeys(for: UserDefaults.standard)
if let customUserDefaults = UserDefaults(suiteName: "com.domain.custom") {
printCustomKeys(for: customUserDefaults)
}
}
var body: some Scene {
WindowGroup { .. }
}
}
我得到的输出是:
Custom keys for UserDefaults suite:
AppleLocale = en_AU
standardA = Standard A value
...
customA = Custom A value
...
Custom keys for UserDefaults suite:
customA = Custom A value
standardA = Standard A value
...
我将“standardA”注册到UserDefaults.standard
自定义套件,将“customA”注册到自定义套件 ( com.domain.custom
)。但是当我打印密钥时,我在两个套件中都看到了“standardA”和“customA”,尽管我预计“standardA”只存在于标准套件中,而“customA”只存在于自定义套件中。
我的问题:为什么钥匙会UserDefaults.standard
出现在我的定制套件中,反之亦然?
我是UserDefaults
不是误解了其中的一些行为?我原以为标准套件和定制套件应该完全隔离。
这是因为你使用了
register
。根据文档,因此使用
register
会始终将键和值添加到注册域。即名称为 的域UserDefaults.registrationDomain
。UserDefaults
除了 指示的域之外,您创建的对象还会始终搜索注册域suitName
。