ios Swift -删除单个反斜杠

55ooxyrt  于 12个月前  发布在  iOS
关注(0)|答案(6)|浏览(208)

这可能是一个愚蠢的问题,但我是新的斯威夫特,我实际上不能弄清楚这一点。
我有API,返回的URL是字符串“http://xxx",我不知道如何存储这种格式的API返回的URL,因为有反斜杠,我无法存储到变量中。
Apple Doc:
.字符串不能包含未转义的反斜杠(\),.
有没有什么方法可以像这样存储字符串,或者如何删除这些单反斜杠,或者如何使用它?
谢谢你的每一个建议。

jecbmhm3

jecbmhm31#

你可以只替换这些反斜杠,例如:

let string2 = string1.replacing("\\", with: "")

字符串
或者,为了避免普通字符串字面量中的反斜杠被另一个反斜杠转义的事实,我们可以使用#""#的扩展字符串:

let string2 = string1.replacing(#"\"#, with: "")


但是,如果可能的话,你真的应该修复那个返回这些反斜杠的API,因为这显然是不正确的。这段代码的作者显然错误地认为必须转义正斜杠,但这不是真的。
总之,API应该被修复为不插入这些反斜杠,但是在修复之前,您可以使用上面的方法来删除可能出现的任何反斜杠。
在下面评论的讨论中,似乎对字符串中的反斜杠有很大的困惑。所以,让我们退后一步,讨论一下"字符串字面量"。正如文档所说,字符串字面量是:
您可以在代码中包含预定义的String值作为字符串字面量。字符串字面量是由一对双引号("")包围的文本字符的固定序列。
注意,字符串字面量只是代码中特定的固定字符序列的表示。但是,这不应该与基础String对象本身混淆。字符串字面量和基础String对象之间的关键区别在于,字符串字面量允许使用反斜杠作为"转义"字符,在表示特殊字符(或进行字符串插值)时使用。正如文档所述:
字符串文字可以包含以下特殊字符:

  • 转义特殊字符\0(空字符)、\\(反斜杠)、\t(水平制表符)、\n(换行符)、\r(回车符)、\"(双引号)和\'(单引号)
  • 任意Unicode标量,写作\u{n},其中n是1 - 8位十六进制数,其值等于有效的Unicode码位

所以,你是正确的,在一个字符串字面量中,正如你上面引用的摘录所指出的,你不能有一个未转义的反斜杠。因此,每当你想在一个字符串字面量中表示一个反斜杠时,你就用\\来表示。
因此,上面的replacing意味着“查看string1,找到所有出现的单个反斜杠,并将其替换为空字符串(即删除反斜杠)。
请考虑:

let string1 = "foo\\bar"

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

let string2 = string1.replacing("\\", with: "")

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


有点令人困惑的是,如果您在"变量"面板的"变量"视图中或在playground中查看string1,它将显示一个字符串文字表示(即反斜杠将显示为"\\")。但是不要混淆。当你在字符串字面量中看到\\时,在实际的字符串中实际上只有一个反斜杠。但是如果你print这个值或者看实际的字符,在字符串中只有一个反斜杠,它本身。
简而言之,不要混淆字符串字面量中的反斜杠转义(例如,replacing的参数)和基础字符串中存在的单个反斜杠。

6mw9ycah

6mw9ycah2#

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

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

try encoder.encode(yourJSONObject)

字符串

8zzbczxx

8zzbczxx3#

请检查下面的代码。

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)

字符串

14ifxucb

14ifxucb4#

我用这段代码解决了:

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

字符串

czfnxgou

czfnxgou5#

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

yjghlzjz

yjghlzjz6#

要删除单个反斜杠,请尝试以下操作

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

字符串

相关问题