带引号和不带引号的字符串数组之间的差异

问题描述 投票:0回答:2
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])时,打印控制台将生成一个不带引号的数组,这表明它们不是字符串。这是怎么回事?

swift
2个回答
0
投票

如果打印出它们的类型,您会发现第二个defNSTaggedPointerString的数组。 NSTaggedPointerStringNSString的私有子类,并且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]

0
投票

在第一个示例中,您可以选择将array展开/推断为字符串数组。因此它记录为["a", "b"],这是双引号中字符串值的标准表示形式。

在第二个中,不会推断类型,因此默认情况下将其记录为array of Any类型值,在此您看不到任何双引号。

© www.soinside.com 2019 - 2024. All rights reserved.