Swift 带引号和不带引号的字符串数组之间的差异?
在第二个示例中,如果未将数组显式强制转换为Swift 带引号和不带引号的字符串数组之间的差异?,swift,Swift,在第二个示例中,如果未将数组显式强制转换为[String](保留为[Any]),打印控制台将生成一个不带引号的数组,这表明它们不是字符串。这里发生了什么?在第一个示例中,您可以选择将数组展开/推断为字符串数组。因此它被记录为[“a”,“b”],这是双引号中字符串值的标准表示形式 在第二个类型中,类型不会被推断,因此默认情况下,它被记录为任何类型值的数组,其中没有任何双引号。如果打印它们的类型,您会发现第二个def是NSTaggedPointerString的数组NSTaggedPointerSt
[String]
(保留为[Any]
),打印控制台将生成一个不带引号的数组,这表明它们不是字符串。这里发生了什么?在第一个示例中,您可以选择将数组展开/推断为字符串数组。因此它被记录为[“a”,“b”]
,这是双引号中字符串值的标准表示形式
在第二个类型中,类型不会被推断,因此默认情况下,它被记录为任何类型值的数组,其中没有任何双引号。如果打印它们的类型,您会发现第二个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"]
}
if let def = UserDefaults.standard.array(forKey: "xxx") {
print(def) // [a, b]
}
UserDefaults.standard.set([“a”,“b”],forKey:“xxx”)
如果让def=UserDefaults.standard.array(forKey:“xxx”)作为?[字符串]{
打印(def)/[“a”、“b”]
打印(类型:def))//数组
用于def中的元素{
print(element,“is a”,type(of:element))//a是字符串
//b是一个字符串
}
}
如果让def=UserDefaults.standard.array(forKey:“xxx”){
打印(def)/[a,b]
打印(类型:def))//数组
用于def中的元素{
打印(元素“是a”,类型(of:element))//a是NSTaggedPointerString
//b是一个NSTaggedPointerString
}
}
将([“a”,“b”]打印为[NSString])/[a,b]
然后让数组:[Any]=[“a”,“b”]
应该打印[a,b]
,但它打印[“a”,“b”]
。这是因为returnType数组(forKey:)
API是[Any]
类型。因此,无论保存哪种类型,在获取时都会将其类型转换为ANY
。另一方面,ANY
可以保存几乎所有的数据类型。因此,在数组事件中,它仍然使用“双引号”进行记录。请注意,UserDefaults
是NSObject的一个子类,它不是纯swift类。因此,保存的字符串数组
将是NSTaggedPointerString
类型,另一方面let array:[Any]
仍将元素的类型返回为String
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]