UserDefaults 如何获得我自己保存的密钥?
UserDefaults How can I get my own saved keys?
我试过这段代码,但它给我带来了除我以外的所有保存的密钥。我怎样才能得到我自己保存的密钥?
print("UD: \(UserDefaults.standard.dictionaryRepresentation().keys) \n")
控制台:
我保存的密钥是“Ağustos Test 1”。
我怎样才能只得到这把钥匙?
您不能仅从用户默认值“获取”您在代码中创建的用户默认值条目的键。您的用户默认值中的内容就是您的用户默认值中的内容;它无法区分“谁”创建了特定条目。
了解您添加的密钥是您的事。通常,此信息会硬编码到您的应用程序中,例如您有一个常量列表,通常作为枚举或结构的静态属性。如果您动态创建密钥,那么如果您需要知道您创建的密钥的名称,存储该信息完全取决于您。
理想情况下,您会知道密钥或将所有密钥分组为另一个密钥的子密钥,但这不是您要求的:)
一些解决方法:
1。全部:
您可以枚举 userDefaults 中的所有密钥,但您必须知道您将获得不是您自己的密钥...
let dict = UserDefaults.standard.dictionaryRepresentation()
for key in dict.keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
这将打印其中的所有内容,其中包括将近一百个苹果配置值。所以..不好!
2。包容性过滤器
如果您的密钥具有共性,您可以反转过滤器:
import Foundation
let included_prefixes = ["myprefs.", "myprefs2."]
//my keys
UserDefaults.standard.set(1, forKey: "myprefs.int1")
UserDefaults.standard.set("str1", forKey: "myprefs2.str1")
let dict = UserDefaults.standard.dictionaryRepresentation()
let keys = dict.keys.filter { key in
for prefix in included_prefixes {
if key.hasPrefix(prefix) {
return true
}
}
return false
}
for key in keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
3。脆弱的独家过滤器
所以如果你真的不知道你的密钥,你可以过滤掉它们
import Foundation
let blacklisted_prefixes = ["Country", "NS", "com.apple", "com.omnigroup", "NavPanel", "WebAutomatic", "NSTableViewDefaultSizeMode", "sks_agent", "Apple", "PayloadUUID", "PKSecure", "_HI", "AK", "ContextMenu", "MultipleSession", "CSUI"]
//my keys
UserDefaults.standard.set(1, forKey: "int1")
UserDefaults.standard.set("str1", forKey: "str1")
let dict = UserDefaults.standard.dictionaryRepresentation()
let keys = dict.keys.filter { key in
for prefix in blacklisted_prefixes {
if key.hasPrefix(prefix) {
return false
}
}
return true
}
for key in keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
但这非常脆弱,不可取!
#needsmust
我试过这段代码,但它给我带来了除我以外的所有保存的密钥。我怎样才能得到我自己保存的密钥?
print("UD: \(UserDefaults.standard.dictionaryRepresentation().keys) \n")
控制台:
我保存的密钥是“Ağustos Test 1”。 我怎样才能只得到这把钥匙?
您不能仅从用户默认值“获取”您在代码中创建的用户默认值条目的键。您的用户默认值中的内容就是您的用户默认值中的内容;它无法区分“谁”创建了特定条目。
了解您添加的密钥是您的事。通常,此信息会硬编码到您的应用程序中,例如您有一个常量列表,通常作为枚举或结构的静态属性。如果您动态创建密钥,那么如果您需要知道您创建的密钥的名称,存储该信息完全取决于您。
理想情况下,您会知道密钥或将所有密钥分组为另一个密钥的子密钥,但这不是您要求的:)
一些解决方法:
1。全部:
您可以枚举 userDefaults 中的所有密钥,但您必须知道您将获得不是您自己的密钥...
let dict = UserDefaults.standard.dictionaryRepresentation()
for key in dict.keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
这将打印其中的所有内容,其中包括将近一百个苹果配置值。所以..不好!
2。包容性过滤器
如果您的密钥具有共性,您可以反转过滤器:
import Foundation
let included_prefixes = ["myprefs.", "myprefs2."]
//my keys
UserDefaults.standard.set(1, forKey: "myprefs.int1")
UserDefaults.standard.set("str1", forKey: "myprefs2.str1")
let dict = UserDefaults.standard.dictionaryRepresentation()
let keys = dict.keys.filter { key in
for prefix in included_prefixes {
if key.hasPrefix(prefix) {
return true
}
}
return false
}
for key in keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
3。脆弱的独家过滤器
所以如果你真的不知道你的密钥,你可以过滤掉它们
import Foundation
let blacklisted_prefixes = ["Country", "NS", "com.apple", "com.omnigroup", "NavPanel", "WebAutomatic", "NSTableViewDefaultSizeMode", "sks_agent", "Apple", "PayloadUUID", "PKSecure", "_HI", "AK", "ContextMenu", "MultipleSession", "CSUI"]
//my keys
UserDefaults.standard.set(1, forKey: "int1")
UserDefaults.standard.set("str1", forKey: "str1")
let dict = UserDefaults.standard.dictionaryRepresentation()
let keys = dict.keys.filter { key in
for prefix in blacklisted_prefixes {
if key.hasPrefix(prefix) {
return false
}
}
return true
}
for key in keys {
if let value = dict[key] {
print("\(key) = \(value)")
}
}
但这非常脆弱,不可取!
#needsmust