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]