UserDefaults 如何获取自己保存的密钥?

Posted

技术标签:

【中文标题】UserDefaults 如何获取自己保存的密钥?【英文标题】:UserDefaults How can I get my own saved keys? 【发布时间】:2021-08-07 15:20:58 【问题描述】:

我尝试了这段代码,但它为我带来了除我之外的所有密钥。如何获取自己保存的密钥?

 print("UD: \(UserDefaults.standard.dictionaryRepresentation().keys) \n")

控制台:

我保存的密钥是“Ağustos Test 1”。 我怎样才能只得到这个密钥?

【问题讨论】:

这能回答你的问题吗? ***.com/questions/63888102/… 不,先生。 “Ağustos 测试 1”、“Ağustos 测试 2”、“Ağustos 测试 3”......我几乎记录了所有月份的考试。我不能为此编写单独的枚举。考试的标题是 UserDefault 中的关键。 其实***.com/questions/63888102/… 完全正确。问题可能是你拒绝相信它?如果是这样,相信它。 【参考方案1】:

您不能仅从用户默认值中“获取”您在代码中创建的用户默认值条目的键。您的用户默认值中的内容就是您的用户默认值中的内容;它无法区分“谁”创建了特定条目。

了解您添加的密钥是您的事。通常,此信息被硬编码到您的应用程序中,例如您有一个常量列表,通常作为枚举或结构的静态属性。如果您是动态创建密钥,那么如果您需要知道您创建的密钥的名称,存储该信息完全取决于您。

【讨论】:

这是定义。正确的电话,我同意它,但本着乐于助人和务实的精神,这不是完整的 IMO【参考方案2】:

理想情况下,您会知道密钥或将所有密钥分组为另一个密钥的子密钥,但这不是您要求的:)

一些解决方法:

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

【讨论】:

以上是关于UserDefaults 如何获取自己保存的密钥?的主要内容,如果未能解决你的问题,请参考以下文章

通过 INDEX 更新和删除 userDefaults 中的对象

UserDefaults(套件名称:)的问题

SwiftUI:如何使用 UserDefaults 保存选择器数据?

如何将两个 UITextView 中的数据保存到 UserDefaults

电脑密钥如何获取??

如何在 SwiftUI 中将 Stepper 数据保存到 UserDefaults?