Chcę usunąć pierwszy znak z ciągu. Jak dotąd najbardziej zwięzła rzecz, na którą wpadłem, to:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Wiem, że nie możemy indeksować do ciągu znaków z Int
powodu Unicode, ale to rozwiązanie wydaje się okropnie rozwlekłe. Czy jest inny sposób, który pomijam?
advance
, przesyłającdisplay.text!
do NSString. Nie mówię, że to dobre rozwiązanie - po prostu skorygowanie możliwego nieporozumienia. Dzięki NSString możesz go indeksować za pomocą Int. - A powodem, dla którego nie możesz indeksować za pomocą Int, nie jest Unicode; dzieje się tak, ponieważ Postać może składać się z wielu złożonych punktów kodowych.String
to Swift 3 wprowadziłcapitalized
funkcję doString
.Odpowiedzi:
Jeśli używasz Swift 3 , możesz zignorować drugą część tej odpowiedzi. Dobra wiadomość jest taka, że teraz jest to znowu zwięzłe! Po prostu używając nowej metody remove (at :) Stringa.
Podoba mi się
dropFirst()
funkcja globalna .Jest krótki, przejrzysty i działa w przypadku wszystkiego, co jest zgodne z protokołem Sliceable.
Jeśli używasz Swift 2 , ta odpowiedź uległa zmianie. Nadal można używać dropFirst, ale nie bez usunięcia pierwszego znaku z
characters
właściwości ciągów, a następnie przekonwertowania wyniku z powrotem na String. dropFirst stał się również metodą, a nie funkcją.Inną alternatywą jest użycie funkcji sufiksu do łączenia łańcucha
UTF16View
. Oczywiście to również musi zostać później przekonwertowane z powrotem na String.Wszystko po to, aby powiedzieć, że rozwiązanie, które pierwotnie zapewniłem, okazało się nie być najbardziej zwięzłym sposobem na zrobienie tego w nowszych wersjach Swifta.
removeAtIndex()
Jeśli szukasz krótkiego i intuicyjnego rozwiązania, polecam skorzystać z rozwiązania @chris .Jak wskazał @vacawama w komentarzach poniżej, kolejną opcją, która nie modyfikuje oryginalnego ciągu, jest użycie substringFromIndex.
Lub jeśli chcesz usunąć znak z początku i końca ciągu, możesz użyć substringWithRange. Tylko pamiętaj, aby chronić się przed stanem, kiedy
startIndex + n > endIndex - m
.Ostatni wiersz można również zapisać za pomocą notacji z indeksem dolnym.
źródło
remove(at:)
metody: jest to usunięty znak, a nie nowy ciąg. Na przykładlet removedCharacter = myString.remove(at: myString.startIndex)
. Popełniłem błąd zwracając wynik wywołania metody, zapominając, że tak było w tym podejściu. Miłego kodowania!Aktualizacja dla Swift 4
W Swift 4
String
dostosowuje sięCollection
ponownie, dzięki czemu można używaćdropFirst
idropLast
przycinać początki i końce strun. Wynik jest typuSubstring
, więc musisz przekazać goString
konstruktorowi, aby otrzymaćString
:dropFirst()
adropLast()
także wybierz,Int
aby określić liczbę znaków do upuszczenia:Jeśli określisz więcej znaków do usunięcia niż w ciągu, wynikiem będzie pusty ciąg (
""
).Aktualizacja dla Swift 3
Jeśli chcesz tylko usunąć pierwszy znak i chcesz zmienić oryginalny ciąg w miejscu, zobacz odpowiedź @ MickMacCallum. Jeśli chcesz w tym procesie utworzyć nowy ciąg, użyj
substring(from:)
. Dzięki rozszerzeniu doString
możesz ukryć brzydotęsubstring(from:)
isubstring(to:)
stworzyć przydatne dodatki, aby przyciąć początek i koniecString
:Podobnie jak
dropFirst
idropLast
wcześniej, te funkcje ulegną awarii, jeśli w ciągu znaków nie ma wystarczającej liczby liter. Na dzwoniącym spoczywa obowiązek prawidłowego korzystania z nich. To jest ważna decyzja projektowa. Można by napisać je tak, aby zwracały opcjonalne, które następnie musiałyby zostać rozpakowane przez wywołującego.Swift 2.x
Niestety w Swift 2 ,
dropFirst
idropLast
(poprzednia najlepsza roztworu) nie jest tak wygodna, jak były poprzednio. Dzięki rozszerzeniu doString
możesz ukryć brzydotęsubstringFromIndex
isubstringToIndex
:Podobnie jak
dropFirst
idropLast
wcześniej, te funkcje ulegną awarii, jeśli w ciągu znaków nie ma wystarczającej liczby liter. Na dzwoniącym spoczywa obowiązek prawidłowego korzystania z nich. To jest ważna decyzja projektowa. Można by napisać je tak, aby zwracały opcjonalne, które następnie musiałyby zostać rozpakowane przez wywołującego.W Swift 1.2 musisz zadzwonić w
chopPrefix
ten sposób:lub możesz dodać podkreślenie
_
do definicji funkcji, aby pominąć nazwę parametru:źródło
Swift 2.2
Swift 3.0
Swift 3.2
Szybki 4
źródło
W Swift 2 zrób to:
Polecam https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html, aby zrozumieć ciągi znaków Swift.
źródło
Zależy od tego, jaki ma być efekt końcowy (mutacja vs brak mutacji).
Od wersji Swift 4.1:
Mutowanie:
Bez mutacji:
Uwagi:
nonmutating
przykładzie, aby zwiększyć jasność. Subiektywnie połączenie dwóch ostatnich kroków byłoby bardziej zwięzłe.dropFirst
wydaje mi się nieco dziwne, ponieważ jeśli dobrze rozumiem Wytyczne dotyczące projektowania interfejsu API Swift ,dropFirst
powinno być takie,dropingFirst
ponieważ nie powoduje mutacji. Tylko myśl :).źródło
droppingFirst
- zawiedli!A co z tym?
To oczywiście zakłada, że twój ciąg jest zmienny. Zwraca znak, który został usunięty, ale zmienia oryginalny ciąg.
źródło
Poprzednie odpowiedzi są całkiem dobre, ale na dzień dzisiejszy myślę, że może to być najbardziej zwięzły sposób na usunięcie pierwszego znaku z ciągu w Swift 4 :
źródło
Nie znam nic bardziej zwięzłego po wyjęciu z pudełka, ale możesz łatwo zaimplementować prefiks
++
, np.Po czym możesz bardzo zwięźle wykorzystać to do syta:
źródło
W Swift 2 użyj tego rozszerzenia String:
źródło
źródło
Aby usunąć pierwszy znak z ciągu
źródło
Oto wersja rozszerzenia do zapisywania awarii Swift4
chopPrefix
, pozostawiającachopSuffix
społeczności ...źródło
Swift3
źródło