2016-01-12 10 views
3

Я получаю строку для названия места из API: "Moe\'s Restaurant & Brewhouse". Я хочу, чтобы это было "Moe's Restaurant & Brewhouse", но я не могу заставить его правильно форматировать без \.Удаление одной обратной косой черты из строки

Я видел другие сообщения на эту тему, я пробовал placeName?.stringByReplacingOccurrencesOfString("\\", withString: "") и placeName?.stringByReplacingOccurrencesOfString("\'", withString: "'"). Я просто не могу заставить работать. Любые идеи, чтобы я мог получить строку, как я хочу ее без \? Любая помощь очень ценится, спасибо!

+0

Возможно, используйте код ascii? String (UnicodeScalar (92)) – Steve

+4

Когда вы говорите, что получаете строку из API, какой тип строкового объекта вы получаете? Так как '\' 'является символом escape для swifts native' String', ваша строка '' Moe \'s Restaurant & Brewhouse'' будет использоваться для использования с родным быстрым 'String' be' 'Moe's Restaurant & Brewhouse''. Возможно, дайте нам еще больший контекст. – dfri

ответ

4

Сообщаете, что API возвращает "Moe\'s Restaurant & Brewhouse". Скорее всего, вы смотрите на словарь Swift или что-то в этом роде, и он показывает вам строковое литеральное представление этой строки. Но в зависимости от того, как вы печатаете это, строка, скорее всего, не содержит обратную косую черту.

Рассмотрим следующий пример:

let string = "Moe's" 
let dictionary = ["name": string] 
print(dictionary) 

Выведется:

[ "имя": "Moe \ 's"]

Он просто показывать "строку буквальное "представление. Как the documentation говорит:

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

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

Но, обратите внимание, что обратная косая черта перед ' в Moe\'s не является частью строки, а скорее просто артефакт печати строкового литерала с эскапильным символом в нем.

Если вы:

let string2 = dictionary["name"]! 
print(string2) 

Он покажет вам, что есть на самом деле нет обратной косой черты есть:

Мо

Аналогично, если вы проверяете количество символов:

print(dictionary["name"]!.characters.count) 

Он будет правильно сообщать, что есть только пять символов, а не шесть.

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


Примечание, если ваша строка действительно имеет обратную косую черту в нем, вы правы, что это правильный способ его удаления:

someString.stringByReplacingOccurrencesOfString("\\", withString: "") 

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

+0

Спасибо за подробный и продуманный ответ. Вы пригвоздили его, определенно немного запутанным. Ура! – tahoecoop

+0

У меня есть некоторые проблемы с этим на данный момент. Если вы напечатаете ключ словаря, он отобразит «чистую» строку (без обратных косых черт, у меня есть '' 'там), но если вы выполните некоторую строчную интерполяцию с этой строкой, то по-прежнему будет наблюдаться люфт. Не говоря уже о том, используете ли вы его по пути: D –

Смежные вопросы