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