Aktualizacja dla Swift 4
W Swift 4 Stringdostosowuje się Collectionponownie, dzięki czemu można używać dropFirsti dropLastprzycinać początki i końce strun. Wynik jest typu Substring, więc musisz przekazać go Stringkonstruktorowi, aby otrzymać String:
let str = "hello"
let result1 = String(str.dropFirst()) // "ello"
let result2 = String(str.dropLast()) // "hell"
dropFirst()a dropLast()także wybierz, Intaby określić liczbę znaków do upuszczenia:
let result3 = String(str.dropLast(3)) // "he"
let result4 = String(str.dropFirst(4)) // "o"
Jeśli określisz więcej znaków do usunięcia niż w ciągu, wynikiem będzie pusty ciąg ( "").
let result5 = String(str.dropFirst(10)) // ""
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 do Stringmożesz ukryć brzydotę substring(from:)i substring(to:)stworzyć przydatne dodatki, aby przyciąć początek i koniec String:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return substring(from: index(startIndex, offsetBy: count))
}
func chopSuffix(_ count: Int = 1) -> String {
return substring(to: index(endIndex, offsetBy: -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Podobnie jak dropFirsti dropLastwcześ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 , dropFirsti dropLast(poprzednia najlepsza roztworu) nie jest tak wygodna, jak były poprzednio. Dzięki rozszerzeniu do Stringmożesz ukryć brzydotę substringFromIndexi substringToIndex:
extension String {
func chopPrefix(count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Podobnie jak dropFirsti dropLastwcześ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 chopPrefixten sposób:
"hello".chopPrefix(count: 3) // "lo"
lub możesz dodać podkreślenie _do definicji funkcji, aby pominąć nazwę parametru:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(_ count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
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.