Czy swift ma metodę przycinania w String?


392

Czy swift ma metodę przycinania w String? Na przykład:

let result = " abc ".trim()
// result == "abc"

4
@mattdipasquale trim jest bardzo popularną nazwą tej operacji
Austin,

Odpowiedzi:


831

Oto jak usunąć wszystkie białe znaki od początku i końca litery String.

(Przykład przetestowany z Swift 2.0 .)

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.stringByTrimmingCharactersInSet(
    NSCharacterSet.whitespaceAndNewlineCharacterSet()
)
// Returns "Let's trim all the whitespace"

(Przykład przetestowany z Swift 3+ .)

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)
// Returns "Let's trim all the whitespace"

Mam nadzieję że to pomoże.


Nie działa na swif 1.2, ponieważ nie ma automatycznej konwencji od String do NSString.
elcuco

5
Działa dobrze w Swift 1.2 - obiekt String ma metodę stringByTrimmingCharactersInSet (nie jest to wyłączna metoda NSString)
Ben Dodson

8
W Swift 3.0 jest: niech trimmedString = myString.trimmingCharacters (w: .whitespaces)
kikettas 19.09.16

6
To nie znaczy, że jest przestarzały. Nie wszyscy jeszcze używają Swift 3.0.
c.dunlap

2
W Swift 3.0 nie spowoduje to usunięcia białych spacji między łańcuchami. Usunie tylko wiodące i końcowe białe spacje. W tym celu zapoznaj się z tą odpowiedzią: stackoverflow.com/a/39067610/4886069

130

Umieść ten kod na pliku w swoim projekcie, coś takiego jak Utils.swift:

extension String
{   
    func trim() -> String
    {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
    }
}

Będziesz mógł to zrobić:

let result = " abc ".trim()
// result == "abc"

Rozwiązanie Swift 3.0

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: NSCharacterSet.whitespaces)
   }
}

Będziesz mógł to zrobić:

let result = " Hello World ".trim()
// result = "HelloWorld"

2
Czy to jest bezpieczne? Jak zapobiec kolizji nazw metod, jeśli Apple lub biblioteka innej firmy doda tę samą metodę String?
ma11hew28,

12
Rozszerzenia są bezpieczne - w rzeczywistości Apple korzysta z nich w swoich wewnętrznych interfejsach API. Nie można zapobiec kolizjom nazw, a to w rzeczywistości jest dobre. Otrzymasz błąd kompilacji, gdy Apple w końcu doda metodę trim () i będziesz wiedział, że twoje rozszerzenie nie jest już wymagane. Rozszerzenia są dość eleganckie i umieszczają metody tam, gdzie są potrzebne, zamiast jakiejś niejasnej klasy narzędziowej, takiej jak StringUtils - mam problem, gdy klasa nie ma metody, której potrzebuję, ponieważ nie zaimportowano innych ram, które dodały do ​​niej rozszerzenia.
absmaci

3
Hej, w Swift 3 powinien zostać zwróconyreturn self.trimmingCharacters(in: .whitespacesAndNewlines)

7
let result = „Hello World” .trim () // result = „HelloWorld” to nie usunie białych znaków zawartych w ciągu. usunie tylko spacje wiodące i końcowe.
Sahil

2
nie spowoduje to usunięcia spacji między łańcuchem. Usuwa tylko wiodące i końcowe miejsce. Tak więc lepszym sposobem na usunięcie spacji między ciągiem jest użycie tekstu? .ReplacingOccurrences (of: "", with: "") zamiast używania trimmingCharacters
Umesh Sawant

57

W Swift 3.0

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: CharacterSet.whitespaces)
   }
}

I możesz zadzwonić

let result = " Hello World ".trim()  /* result = "Hello World" */

4
Co jeśli chcę tylko przycinać końcowe i wiodące białe znaki?
Suragch

1
Jestem nowy w szybkich 3 rozszerzeniach. Jeśli biblioteka modyfikuje ciąg, a ja również modyfikuję ciąg, czy możliwe jest uzyskanie kolizji? Co się stanie, jeśli przyszłe wersje metody swift ad a trim ()? Więc… w zasadzie… czy korzystanie z rozszerzeń jest bezpieczne w ten sposób?
Gattster,

1
możliwe jest uzyskanie kolizji.
Alex Brown

let result = „Hello World” .trim () // result = „HelloWorld” to nie usunie białych znaków zawartych w ciągu. usunie tylko spacje wiodące i końcowe
Sahil

45

Swift 5 i 4.2

let trimmedString = " abc ".trimmingCharacters(in: .whitespaces)
 //trimmedString == "abc"


9

Tak, możesz to zrobić w następujący sposób:

var str = "  this is the answer   "
str = str.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
print(srt) // "this is the answer"

CharacterSet to tak naprawdę potężne narzędzie do tworzenia reguły przycinania o wiele większej elastyczności niż wstępnie zdefiniowany zestaw, taki jak .whitespacesAndNewlines.

Na przykład:

var str = " Hello World !"
let cs = CharacterSet.init(charactersIn: " !")
str = str.trimmingCharacters(in: cs)
print(str) // "Hello World"

6

Obetnij ciąg znaków do określonej długości

Jeśli wprowadziłeś blok zdania / tekstu i chcesz zapisać z niego tylko określoną długość tekstu. Dodaj następujące rozszerzenie do klasy

extension String {

   func trunc(_ length: Int) -> String {
    if self.characters.count > length {
        return self.substring(to: self.characters.index(self.startIndex, offsetBy: length))
    } else {
        return self
    }
  }

  func trim() -> String{
     return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
   }

}

Posługiwać się

var str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
//str is length 74
print(str)
//O/P:  Lorem Ipsum is simply dummy text of the printing and typesetting industry.

str = str.trunc(40)
print(str)
//O/P: Lorem Ipsum is simply dummy text of the 


5

Kolejny podobny sposób:

extension String {
    var trimmed:String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

Posługiwać się:

let trimmedString = "myString ".trimmed

4
extension String {
    /// EZSE: Trims white space and new line characters
    public mutating func trim() {
         self = self.trimmed()
    }

    /// EZSE: Trims white space and new line characters, returns a new string
    public func trimmed() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
}

Zaczerpnięte z mojego repozytorium: https://github.com/goktugyil/EZSwiftExtensions/commit/609fce34a41f98733f97dfd7b4c23b5d16416206


Podoba mi się szybkie zgodne czasownik dla niemutowania.
Alex Brown

4

W Swift3 XCode 8 Final

Zauważ, że CharacterSet.whitespaces to nie jest już funkcja!

(Ani też nie NSCharacterSet.whitespaces)

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

3

// Swift 4.0 Usuń spacje i nowe linie

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)         
    }
}

2

Możesz również wysyłać postacie, które chcesz przyciąć

extension String {


    func trim() -> String {

        return self.trimmingCharacters(in: .whitespacesAndNewlines)

    }

    func trim(characterSet:CharacterSet) -> String {

        return self.trimmingCharacters(in: characterSet)

    }
}

validationMessage = validationMessage.trim(characterSet: CharacterSet(charactersIn: ","))

0

Stworzyłem tę funkcję, która pozwala wprowadzić ciąg znaków i zwraca listę ciągów przyciętych dowolnym znakiem

 func Trim(input:String, character:Character)-> [String]
{
    var collection:[String] = [String]()
    var index  = 0
    var copy = input
    let iterable = input
    var trim = input.startIndex.advancedBy(index)

    for i in iterable.characters

    {
        if (i == character)
        {

            trim = input.startIndex.advancedBy(index)
            // apennding to the list
            collection.append(copy.substringToIndex(trim))

            //cut the input
            index += 1
            trim = input.startIndex.advancedBy(index)
            copy = copy.substringFromIndex(trim)

            index = 0
        }
        else
        {
            index += 1
        }
    }
    collection.append(copy)
    return collection

}

jak nie znalazłem sposobu, aby to zrobić w swift (kompiluje się i działa idealnie w swift 2.0)


2
czy możesz na przykład zdefiniować, co rozumiesz przez „przycinanie”? Ponieważ typem zwracanym jest [Ciąg], nie można wdrożyć tego, czego zażądał PO. (który zwraca ciąg znaków)
Alex Brown

0

Nie zapomnij o import Foundationlub UIKit.

import Foundation
let trimmedString = "   aaa  "".trimmingCharacters(in: .whitespaces)
print(trimmedString)

Wynik:

"aaa"

W przeciwnym razie otrzymasz:

error: value of type 'String' has no member 'trimmingCharacters'
    return self.trimmingCharacters(in: .whitespaces)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.