2015-12-01 4 views
4

это, возможно, глупый вопрос, но я новичок в быстром, и на самом деле я не могу понять это.Swift - удалить одиночную обратную косую черту

У меня есть API, который возвращает url как строку «http: \/\/xxx». Я не знаю, как сохранить URL-адрес, возвращенный API в этом формате. Я не могу сохранить его в переменной из-за обратной косой черты.

Из яблочного дока:

... строка не может содержать неэкранированную обратную косую черту (\), ...

Есть ли способ, как хранить строку, как это или как удалить эти одиночные обратные косые черты или как работать с этим?

Благодарим за каждый совет.

+0

Адрес, в котором находилась обратная косая черта? – matt

+0

Извините, я не заметил, что обратная косая черта исчезла. Я добавил их в url. – marysmech

ответ

4

Вы можете просто заменить эти обратные косые черты, например:

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

Но, если это возможно, вы действительно должны исправить это API, который возвращает эти обратные косые черты, так как это, очевидно, неправильно. Автору этого кода, по-видимому, было ошибочное впечатление, что передние косые черты должны быть экранированы, но это неверно.

Нижняя линия, API должен быть закреплен, чтобы не вставлять эти обратные косые черты, но до тех пор, пока это не будет исправлено, вы можете использовать приведенное выше, чтобы удалить любые обратные косые черты, которые могут возникнуть.

В обсуждении нижеприведенных комментариев, похоже, имеется огромная путаница в обратных косых чертах. Итак, давайте отступим на секунду и обсудим «строковые литералы». Как the documentation говорит, строка литерал:

Вы можете включать в себя предустановленные String значения в коде как строковые литералы. Строковый литерал - это фиксированная последовательность текстовых символов, окруженная парой двойных кавычек ("").

Примечание. Строковый литерал представляет собой просто представление определенной фиксированной последовательности символов в коде. Но это не следует путать с основным объектом String. Основное различие между строковым литералом и базовым объектом String состоит в том, что строковый литерал позволяет использовать обратную косую черту как символ «escape», используемый при представлении специальных символов (или для выполнения string interpolation).Как the documentation says:

Строковые литералы могут включать в себя следующие специальные символы:

  • Экранированный специальные символы \0 (нулевой символ), \\ (обратный слеш), \t (горизонтальная табуляция), \n (строки) , \r (возврат каретки), \" (двойные кавычки) и \' (апостроф)
  • произвольный скалярная Unicode, записывается в виде \u{n}, где n является 1-8 шестнадцатеричный номер со значением равным действительной точки кода Unicode

Итак, вы правы, что в строковый литерал, как отрывок вы процитированном выше указывает, вы не можете иметь необработанный обратный слэш. Таким образом, всякий раз, когда вы хотите представить одиночную обратную косую черту в строковом литерале, вы представляете это с помощью \\.

Таким образом, приведенное выше значение 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" 

Немного смутно, если вы посмотрите на string1 в «Переменные» Вид «Debug» панели или в пределах игровой площадки, он будет показывать строкового литерала представление (то есть обратный слеш будет появляться как "\\"). Но не путайте. Когда вы видите \\ в строковом литерале, на самом деле существует только одна обратная косая черта в текущей строке. Но если вы используете print значение или посмотрите на фактические символы, в самой строке есть только одна обратная косая черта.

Вкратце, не сдерживайте экранирование обратной косой черты в строковом литерале (например, параметры до stringByReplacingOccurrencesOfString) и одиночный обратный слэш, который существует в базовой строке.

+0

Но у меня нет «\\», у меня есть только «\», поэтому я не могу даже сохранить его в строке (по крайней мере я не знаю, как). – marysmech

+0

Да, но «\» является зарезервированным символом, указывающим, что следующий символ указывает, что делать (например, '\ n' - это новая строка,' \ r' - возврат и т. Д.). То, как вы представляете «\» в строковом литерале, в строке, это «\\». Я знаю, что это сбивает с толку, но так оно и работает. – Rob

+0

Благодарим за информацию. Я действительно понимаю все эти вещи, но я просто хотел знать, могу ли я что-нибудь сделать, если я получаю строку в этом формате. Так что в основном, если я получаю строку с «\», я ничего не могу сделать? Потому что я не могу сохранить эту строку для замены «\» на «\\» в swift. – marysmech

1

Включите обратную косую черту в строке, добавив дополнительную обратную косую черту.

+0

Благодарим за комментарий. Я не знаю, как добавить обратную косую черту, потому что я не могу выполнить 'var str =" http: \/\/"' или я что-то упускаю? – marysmech

+0

Теперь вы добавляете escape-символ плюс косую черту. Вы можете добавить backslah, добавив escape-символ, за которым следует обратная косая черта (escape-символ). var str = "http: \\\\ www." – Vincent

+0

Подумайте об этом, для веб-сайта вам нужна косая черта. Поэтому вы можете легко назначить: var str = «http://www.ebay.nl» – Vincent

0

Пожалуйста, проверьте приведенный ниже код.

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) 
Смежные вопросы