Я хочу удалить первый символ из строки. Пока что самая лаконичная вещь, которую я придумал:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Я знаю, что мы не можем индексировать строку с помощью Int
Unicode, но это решение кажется ужасно подробным. Есть ли другой способ, который я не замечаю?
advance
,display.text!
применив NSString. Я не говорю, что это хорошее решение - просто исправляю возможное заблуждение. С NSString вы можете индексировать его с помощью Int. - И причина, по которой вы не можете индексировать с помощью Int, не из-за Unicode; это потому, что символ может состоять из нескольких составных кодовых точек.String
тогда Swift 3 представил этуcapitalized
функцию дляString
.Ответы:
Если вы используете Swift 3 , вы можете проигнорировать второй раздел этого ответа. Хорошие новости в том, что теперь он снова стал лаконичным! Просто используя новый метод String remove (at :).
Мне нравится глобальная
dropFirst()
функция для этого.Он короткий, понятный и подходит для всего, что соответствует протоколу Sliceable.
Если вы используете Swift 2 , этот ответ изменился. Вы по-прежнему можете использовать dropFirst, но не без удаления первого символа из
characters
свойства strings и последующего преобразования результата обратно в String. dropFirst также стал методом, а не функцией.Другой альтернативой является использование функции суффикса для объединения строки
UTF16View
. Конечно, это также должно быть впоследствии преобразовано обратно в String.Все это означает, что решение, которое я изначально предоставил, оказалось не самым лаконичным способом сделать это в новых версиях Swift. Я рекомендую использовать решение @chris,
removeAtIndex()
если вы ищете короткое и интуитивно понятное решение.И, как указывает @vacawama в комментариях ниже, другой вариант, который не изменяет исходную строку, - это использовать substringFromIndex.
Или, если вы хотите отбросить символ в начале и конце строки, вы можете использовать substringWithRange. Только обязательно остерегайтесь состояния, когда
startIndex + n > endIndex - m
.Последняя строка также может быть записана с использованием нижних индексов.
источник
remove(at:)
метода: это удаленный символ, а не новая строка. Например,let removedCharacter = myString.remove(at: myString.startIndex)
. Я совершал ошибку, возвращая результат вызова метода, забыв, что это имело место в данном подходе. Удачного всем кодирования!Обновление для Swift 4
В Swift 4 снова
String
соответствуетCollection
, поэтому можно использоватьdropFirst
иdropLast
обрезать начало и конец строк. Результат имеет типSubstring
, поэтому вам нужно передать егоString
конструктору, чтобы вернутьString
:dropFirst()
аdropLast()
также возьмите,Int
чтобы указать количество отбрасываемых символов:Если вы укажете для отбрасывания больше символов, чем указано в строке, результатом будет пустая строка (
""
).Обновление для Swift 3
Если вы просто хотите удалить первый символ и хотите заменить исходную строку, см. Ответ @MickMacCallum. Если вы хотите создать новую строку в процессе, используйте
substring(from:)
. С помощью расширенияString
вы можете скрыть уродствоsubstring(from:)
иsubstring(to:)
создать полезные дополнения для обрезки начала и концаString
:Как
dropFirst
иdropLast
до них, эти функции будут аварийно завершены, если в строке будет недостаточно букв. Ответственность за правильное их использование лежит на вызывающем абоненте. Это верное дизайнерское решение. Можно написать их так, чтобы они возвращали необязательный параметр, который затем должен был быть развернут вызывающим.Swift 2.x
Увы в Swift 2 ,
dropFirst
иdropLast
(предыдущий лучшее решение) не так удобно , как они были раньше. С помощью расширения наString
можно скрыть уродствоsubstringFromIndex
иsubstringToIndex
:Как
dropFirst
иdropLast
до них, эти функции будут аварийно завершены, если в строке будет недостаточно букв. Ответственность за правильное их использование лежит на вызывающем абоненте. Это верное дизайнерское решение. Можно написать их так, чтобы они возвращали необязательный параметр, который затем должен был быть развернут вызывающим.В Swift 1.2 вам нужно будет позвонить
chopPrefix
так:или вы можете добавить подчеркивание
_
к определениям функций, чтобы подавить имя параметра:источник
Swift 2.2
Swift 3.0
Swift 3.2
Swift 4
источник
В Swift 2 сделайте следующее:
Я рекомендую https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html, чтобы получить представление о строках Swift.
источник
Зависит от того, каким должен быть конечный результат (мутирующий или неизменяющийся).
Начиная с Swift 4.1:
Минимальное видоизменение:
Nonmutating:
Ноты:
nonmutating
Для ясности я добавил дополнительный шаг в пример. Субъективно объединение двух последних шагов было бы более лаконичным.dropFirst
кажется мне немного странным, потому что, если я правильно понимаю Рекомендации по дизайну Swift API ,dropFirst
действительно должно быть что-то вроде того,dropingFirst
что оно не изменяет. Просто мысль :).источник
droppingFirst
- они напортачили!Как насчет этого?
Это, конечно, предполагает, что ваша строка изменяема. Он возвращает символ, который был удален, но изменяет исходную строку.
источник
Предыдущие ответы довольно хороши, но на сегодняшний день я думаю, что это может быть наиболее лаконичный способ удалить первый символ из строки в Swift 4 :
источник
Я не знаю ничего более лаконичного из коробки, но вы могли бы легко реализовать префикс
++
, например,После чего вы можете использовать его сколько душе угодно очень лаконично:
источник
В Swift 2 используйте это расширение String:
источник
источник
Чтобы удалить первый символ из строки
источник
Вот версия расширения Swift4 с аварийным сохранением
chopPrefix
, оставляющаяchopSuffix
сообществу ...источник
Swift3
источник