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

Ufu*_*ker 0 swift userdefaults

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

\n
 print("UD: \\(UserDefaults.standard.dictionaryRepresentation().keys) \\n")\n
Run Code Online (Sandbox Code Playgroud)\n

安慰:

\n

在此输入图像描述

\n

我保存的密钥是“A\xc4\x9fustos Test 1”。\n我怎样才能只获得这个密钥?

\n

Dai*_*jan 6

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

一些解决方法:

1.全部:

你可以枚举 userDefaults 中的所有键,但你必须知道你会得到不属于你的键......

let dict = UserDefaults.standard.dictionaryRepresentation()
for key in dict.keys {
  if let value = dict[key] {
    print("\(key) = \(value)")
  }
}
Run Code Online (Sandbox Code Playgroud)

这将打印其中的所有内容,其中包括近一百个苹果配置值。所以..不好!

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)")
  }
}
Run Code Online (Sandbox Code Playgroud)

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)")
  }
}
Run Code Online (Sandbox Code Playgroud)

但这非常脆弱,并不可取!

#需要必须