UserDefaults.standard.set(["a", "b"], forKey: "xxx")
if let def = UserDefaults.standard.array(forKey: "xxx") as? [String] {
print(def) // ["a", "b"]
}
if let def = UserDefaults.standard.array(forKey: "xxx") {
print(def) // [a, b]
}
[在第二个示例中,当您未将数组显式转换为[String]
(保留为[Any]
)时,打印控制台将生成一个不带引号的数组,这表明它们不是字符串。这是怎么回事?
如果打印出它们的类型,您会发现第二个def
是NSTaggedPointerString
的数组。 NSTaggedPointerString
是NSString
的私有子类,并且NSString
在数组中时,输出到控制台时没有双引号。
UserDefaults.standard.set(["a", "b"], forKey: "xxx")
if let def = UserDefaults.standard.array(forKey: "xxx") as? [String] {
print(def) // ["a", "b"]
print(type(of: def)) // Array<String>
for element in def {
print(element, "is a", type(of: element)) // a is a String
// b is a String
}
}
if let def = UserDefaults.standard.array(forKey: "xxx") {
print(def) // [a, b]
print(type(of: def)) // Array<Any>
for element in def {
print(element, "is a", type(of: element)) // a is a NSTaggedPointerString
// b is a NSTaggedPointerString
}
}
print(["a", "b"] as [NSString]) // [a, b]
在第一个示例中,您可以选择将array
展开/推断为字符串数组。因此它记录为["a", "b"]
,这是双引号中字符串值的标准表示形式。
在第二个中,不会推断类型,因此默认情况下将其记录为array of Any
类型值,在此您看不到任何双引号。