这可能是一个愚蠢的问题,但我是新手,我实际上无法解决这个问题。
我有API将url作为字符串“ http:\ / \ / xxx ”返回。我不知道如何以这种格式存储从API返回的URL。由于反斜杠,我无法将其存储到变量中。
来自apple doc:
... string不能包含未转义的反斜杠(\),...
有没有办法如何存储这样的字符串或如何删除这些单反斜杠或如何使用它?
感谢您的一切建议。
答案 0 :(得分:6)
您可以只替换那些反斜杠,例如:
let string2 = string1.stringByReplacingOccurrencesOfString("\\", withString: "")
但是,如果可能的话,你真的应该修复那些返回那些反斜杠的API,因为这显然是不正确的。该代码的作者显然错误地认为必须转发正斜杠,但事实并非如此。
最重要的是,API应固定为不插入这些反斜杠,但在解决之前,您可以使用上述方法删除可能出现的任何反斜杠。
在下面评论的讨论中,关于字符串中的反斜杠似乎存在巨大的混淆。所以,让我们退一步,讨论"字符串文字"。正如the documentation所说,字符串文字是:
您可以在代码中包含预定义的
String
值作为字符串文字。字符串文字是由一对双引号(""
)包围的固定文本字符序列。
注意,字符串文字只是代码中特定固定字符序列的表示。但是,这不应该与潜在的String
对象本身混淆。字符串文字与底层String
对象之间的主要区别在于字符串文字允许使用反斜杠作为"转义"字符,用于表示特殊字符(或执行string interpolation)。正如the documentation says:
字符串文字可以包含以下特殊字符:
- 转义的特殊字符
\0
(空字符),\\
(反斜杠),\t
(水平标签),\n
(换行),{{1} }(回车),\r
(双引号)和\"
(单引号)- 任意Unicode标量,写为
\'
,其中\u{n}
是1-8位十六进制数,其值等于有效的Unicode代码点
所以,你是正确的,在字符串文字中,正如你上面引用的摘录所指出的,你不能有一个未转义的反斜杠。因此,只要您想在字符串文字中表示单个反斜杠,就可以用n
来表示。
因此,上面的\\
表示"查看stringByReplacingOccurrencesOfString
,查找所有出现的单个反斜杠,并用空字符串替换它们(即删除反斜杠)。&#34 ;
考虑:
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"
,有点令人困惑。 " Debug"的视图在面板或操场内,它将显示字符串文字表示(即反斜杠将显示为string1
)。但不要感到困惑。当您在字符串文字中看到"\\"
时,实际字符串中实际上只有一个反斜杠。但是如果你\\
值或查看实际字符,字符串中只有一个反斜杠本身。
简而言之,不要将字符串文字中的反斜杠转义(例如,print
的参数)与基础字符串中存在的单个反斜杠混淆。
答案 1 :(得分:1)
通过添加额外的反斜杠在字符串中包含反斜杠。
答案 2 :(得分:1)
请检查以下代码。
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)
答案 3 :(得分:1)
要删除单个反斜杠,请尝试此 让replaceStr = backslashString.replacingOccurrences(of:“ \”“,加上:”“)
答案 4 :(得分:0)
我已经用这段代码解决了:
let convertedStr = jsonString.replacingOccurrences(of: "\\/", with: "/")
答案 5 :(得分:0)
我发现在尝试将对象编码为JSON时遇到同样的问题。根据您是否使用较新的Xamarin.Essentials.AppDataDirectory
类来解析JSON,以及是否支持最低iOS 13,可以使用JSONEncoder
输出格式:
.withoutEscapingSlashes