Swift - 删除单个反斜杠

Swift - remove single backslash

这可能是个愚蠢的问题,但我是 swift 的新手,实际上我无法弄明白。

我有 API 其中 returns url 作为字符串“http:\/\/xxx”。我不知道如何以这种格式存储从 API 返回的 URL。由于反斜杠,我无法将它存储到变量中。

来自苹果文档:

...string cannot contain an unescaped backslash (\), ...

有没有什么方法可以像这样存储字符串或如何删除这些单反斜杠或如何使用它?

谢谢你的每一个建议。

通过添加额外的反斜杠在字符串中包含反斜杠。

您可以只替换那些反斜杠,例如:

let string2 = string1.stringByReplacingOccurrencesOfString("\", withString: "")

或者,为了避免混淆正常字符串文字中的反斜杠被另一个反斜杠转义的事实,我们可以使用 #""#extended string delimiter :

let string2 = string1.stringByReplacingOccurrencesOfString(#"\"#, withString: "")

但是,如果可能的话,您确实应该修复返回这些反斜杠的 API,因为这显然是不正确的。该代码的作者显然误以为正斜杠必须转义,但事实并非如此。

最重要的是,API 应该固定为不插入这些反斜杠,但在修复之前,您可以使用上面的方法删除可能出现的任何反斜杠。


在下面评论的讨论中,似乎对字符串中的反斜杠存在极大的混淆。那么,让我们退后一步,讨论一下“字符串文字”。正如 the documentation 所说,字符串文字是:

You can include predefined String values within your code as string literals. A string literal is a fixed sequence of textual characters surrounded by a pair of double quotes ("").

请注意,字符串文字只是代码中特定固定字符序列的表示。但是,这不应与底层 String 对象本身混淆。字符串文字和基础 String 对象之间的主要区别在于,字符串文字允许使用反斜杠作为“转义”字符,用于表示特殊字符(或执行 string interpolation). As the documentation says:

String literals can include the following special characters:

  • The escaped special characters [=19=] (null character), \ (backslash), \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quote) and \' (single quote)
  • An arbitrary Unicode scalar, written as \u{n}, where n is a 1–8 digit hexadecimal number with a value equal to a valid Unicode code point

所以,正如您在上面引用的摘录所指出的那样,您在字符串文字中是正确的,您不能有未转义的反斜杠。因此,每当您想在字符串文字中表示单个反斜杠时,您可以使用 \.

来表示它

因此上面的 stringByReplacingOccurrencesOfString 意思是“查看 string1,找到所有出现的单个反斜杠,并将它们替换为空字符串(即删除反斜杠)”。

考虑:

let string1 = "foo\bar"

print(string1)                    // this will print "foo\bar"
print(string1.characters.count)   // this will print "7", not "8"

let string2 = string1.stringByReplacingOccurrencesOfString("\", withString: "")

print(string2)                    // this will print "foobar"
print(string2.characters.count)   // this will print "6"

有点令人困惑,如果您在“调试”面板的“变量”视图中或在 playground 中查看 string1,它将显示字符串文字表示(即反斜杠将显示为 "\").但不要混淆。当您在字符串文字中看到 \ 时,实际字符串中实际上只有一个反斜杠。但是,如果您 print 值或查看实际字符,则字符串本身只有一个反斜杠。

简而言之,不要将字符串文字中的反斜杠转义(例如,stringByReplacingOccurrencesOfString 的参数)与底层字符串中存在的单个反斜杠混为一谈。

请检查以下代码。

let jsonStr = "[{\"isSelected\":true,\"languageProficiencies\":[{\"isSelected\":true,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"English\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Malay\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Chinese\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Tamil\"}]"
let convertedStr = jsonStr.replacingOccurrences(of: "\", with: "", options: .literal, range: nil)
print(convertedStr)

要删除单个反斜杠,试试这个

let replaceStr = backslashString.replacingOccurrences(of: "\"", with: "")

我已经用这段代码解决了:

let convertedStr = jsonString.replacingOccurrences(of: "\/", with: "/") 

我发现在尝试将我的对象编码为 JSON 时遇到了同样的问题。根据您是否使用较新的 JSONEncoder class 来解析您的 JSON 并且您至少支持 iOS 13,您可以使用 .withoutEscapingSlashes 输出格式:

let encoder = JSONEncoder()
encoder.outputFormatting = .withoutEscapingSlashes

try encoder.encode(yourJSONObject)