Ricerca…


Sintassi

  • String.characters // Restituisce una matrice dei caratteri nella stringa
  • String.characters.count // Restituisce il numero di caratteri
  • String.utf8 // A String.UTF8View, restituisce i punti carattere UTF-8 nella stringa
  • String.utf16 // A String.UTF16View, restituisce i punti carattere UTF-16 nella stringa
  • String.unicodeScalars // A String.UnicodeScalarView, restituisce i punti carattere UTF-32 nella stringa
  • String.isEmpty // Restituisce true se la stringa non contiene alcun testo
  • String.hasPrefix (String) // Restituisce true se la stringa è preceduta dall'argomento
  • String.hasSuffix (String) // Restituisce true se la stringa è suffissa con l'argomento
  • String.startIndex // Restituisce l'indice che corrisponde al primo carattere nella stringa
  • String.endIndex // Restituisce l'indice che corrisponde allo spot dopo l'ultimo carattere nella stringa
  • String.components (separatedBy: String) // Restituisce una matrice contenente le sottostringhe separate dalla stringa di separazione specificata
  • String.append (carattere) // Aggiunge il carattere (fornito come argomento) alla stringa

Osservazioni

Una String in Swift è una raccolta di caratteri e, per estensione, una raccolta di scalari Unicode. Poiché le stringhe Swift si basano su Unicode, possono essere qualsiasi valore scalare Unicode, incluse le lingue diverse dall'inglese e dagli emoji.

Poiché due scalari potrebbero combinarsi per formare un singolo carattere, il numero di scalari in una stringa non è necessariamente sempre uguale al numero di caratteri.

Per ulteriori informazioni su Stringhe, vedere The Swift Programming Language e String Structure Reference .

Per dettagli sull'implementazione, vedi "Swift String Design"

String and Character Literals

I valori letterali delle stringhe in Swift sono delimitati da virgolette doppie ( " ):

let greeting = "Hello!"  // greeting's type is String

I caratteri possono essere inizializzati da string letterali, purché il letterale contenga solo un grafo grafo:

let chr: Character = "H" // valid
let chr2: Character = "😊" // valid
let chr3: Character = "abc" // invalid - multiple grapheme clusters

Interpolazione a stringa

L'interpolazione delle stringhe consente di iniettare un'espressione direttamente in una stringa letterale. Questo può essere fatto con tutti i tipi di valori, comprese stringhe, numeri interi, numeri in virgola mobile e altro.

La sintassi è una barra rovesciata seguita da parentesi che racchiudono il valore: \(value) . Qualsiasi espressione valida può apparire tra parentesi, incluse le chiamate di funzione.

let number = 5
let interpolatedNumber = "\(number)"  // string is "5"
let fortyTwo = "\(6 * 7)"             // string is "42"

let example = "This post has \(number) view\(number == 1 ? "" : "s")"
// It will output "This post has 5 views" for the above example.
// If the variable number had the value 1, it would output "This post has 1 view" instead.

Per i tipi personalizzati, il comportamento predefinito dell'interpolazione delle stringhe è che "\(myobj)" è equivalente a String(myobj) , la stessa rappresentazione utilizzata da print(myobj) . È possibile personalizzare questo comportamento implementando il protocollo CustomStringConvertible per il proprio tipo.

3.0

Per Swift 3, in conformità con SE-0089 , String.init<T>(_:) è stato rinominato in String.init<T>(describing:) .

L'interpolazione stringa "\(myobj)" preferirà il nuovo String.init<T: LosslessStringConvertible>(_:) initializer, ma ritornerà a init<T>(describing:) se il valore non è LosslessStringConvertible .

Personaggi speciali

Alcuni personaggi richiedono una sequenza di escape speciale per utilizzarli in stringhe letterali:

Personaggio Senso
\0 il carattere null
\\ un semplice backslash, \
\t un carattere di tabulazione
\v una scheda verticale
\r un ritorno a capo
\n un avanzamento riga ("newline")
\" una doppia citazione, "
\' una sola citazione, '
\u{n} il codice Unicode point n (in esadecimale)

Esempio:

let message = "Then he said, \"I \u{1F496} you!\""

print(message) // Then he said, "I 💖 you!"

Stringhe concatenate

Concatena le stringhe con l'operatore + per produrre una nuova stringa:

let name = "John"
let surname = "Appleseed"
let fullName = name + " " + surname  // fullName is "John Appleseed"

Aggiungi a una stringa mutabile usando l' operatore di assegnazione composto += o usando un metodo:

let str2 = "there"
var instruction = "look over"
instruction += " " + str2  // instruction is now "look over there"

var instruction = "look over"
instruction.append(" " + str2)  // instruction is now "look over there"

Aggiungi un singolo carattere a una stringa mutabile:

var greeting: String = "Hello"
let exclamationMark: Character = "!"
greeting.append(exclamationMark) 
// produces a modified String (greeting) = "Hello!"

Aggiungi più caratteri a una stringa mutabile

var alphabet:String = "my ABCs: "
alphabet.append(contentsOf: (0x61...0x7A).map(UnicodeScalar.init)
                                         .map(Character.init) )
// produces a modified string (alphabet) = "my ABCs: abcdefghijklmnopqrstuvwxyz"
3.0

appendContentsOf(_:) è stato rinominato per append(_:) .

Unisci una sequenza di stringhe per formare una nuova stringa usando joinWithSeparator(_:) :

let words = ["apple", "orange", "banana"]
let str = words.joinWithSeparator(" & ")

print(str)   // "apple & orange & banana"
3.0

joinWithSeparator(_:) è stato rinominato come joined(separator:) .

Il separator è la stringa vuota per impostazione predefinita, quindi ["a", "b", "c"].joined() == "abc" .

Esamina e confronta le stringhe

Controlla se una stringa è vuota:

if str.isEmpty {
    // do something if the string is empty
}

// If the string is empty, replace it with a fallback:
let result = str.isEmpty ? "fallback string" : str

Verifica se due stringhe sono uguali (nel senso dell'equivalenza canonica Unicode ):

"abc" == "def"          // false
"abc" == "ABC"          // false
"abc" == "abc"          // true

// "LATIN SMALL LETTER A WITH ACUTE" == "LATIN SMALL LETTER A" + "COMBINING ACUTE ACCENT"
"\u{e1}" == "a\u{301}"  // true

Controlla se una stringa inizia / finisce con un'altra stringa:

"fortitude".hasPrefix("fort")      // true
"Swift Language".hasSuffix("age")  // true

Codifica e decomposizione delle stringhe

Una stringa Swift è composta da punti di codice Unicode . Può essere decomposto e codificato in diversi modi.

let str = "ที่👌①!"

Stringhe decomponenti

I characters una stringa sono grafi di grafi estesi Unicode:

Array(str.characters)  // ["ที่", "👌", "①", "!"]

unicodeScalars sono i punti di codice Unicode che costituiscono una stringa (si noti che ที่ è un unicodeScalars , ma 3 punti di codice - 3607, 3637, 3656 - quindi la lunghezza dell'array risultante non è la stessa dei characters ):

str.unicodeScalars.map{ $0.value }  // [3607, 3637, 3656, 128076, 9312, 33]

È possibile codificare e decomporre le stringhe come UTF-8 (una sequenza di UInt8 s) o UTF-16 (una sequenza di UInt16 s):

Array(str.utf8)   // [224, 184, 151, 224, 184, 181, 224, 185, 136, 240, 159, 145, 140, 226, 145, 160, 33]
Array(str.utf16)  // [3607, 3637, 3656, 55357, 56396, 9312, 33]

Lunghezza delle corde e iterazione

I characters una stringa, unicodeScalars , utf8 e utf16 sono tutti i Collection s, quindi puoi ottenere il loro count e iterare su di essi:

// NOTE: These operations are NOT necessarily fast/cheap! 

str.characters.count     // 4
str.unicodeScalars.count // 6
str.utf8.count           // 17
str.utf16.count          // 7
for c in str.characters { // ...
for u in str.unicodeScalars { // ...
for byte in str.utf8 { // ...
for byte in str.utf16 { // ...

Unicode

Impostazione dei valori

Usando direttamente Unicode

var str: String = "I want to visit 北京, Москва, मुंबई, القاهرة, and 서울시. 😊"
var character: Character = "🌍"

Utilizzo di valori esadecimali

var str: String = "\u{61}\u{5927}\u{1F34E}\u{3C0}" // a大🍎π
var character: Character = "\u{65}\u{301}" // é = "e" + accent mark

Si noti che Swift Character può essere composto da più punti di codice Unicode, ma sembra essere un singolo carattere. Questo è chiamato Grapheme Cluster esteso.

conversioni

String -> Hex

// Accesses views of different Unicode encodings of `str`
str.utf8
str.utf16
str.unicodeScalars // UTF-32

Esadecimale -> stringa

let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E

let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)) // 大
let string2 = String(UnicodeScalar(value2)) // 🍎

// convert hex array to String
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array
var myString = ""
for hexValue in myHexArray {
    myString.append(UnicodeScalar(hexValue))
}
print(myString) // Cat‼🐱

Nota che per UTF-8 e UTF-16 la conversione non è sempre così facile perché cose come le emoji non possono essere codificate con un singolo valore UTF-16. Ci vuole una coppia surrogata.

Inversione di archi

2.2
let aString = "This is a test string."

// first, reverse the String's characters 
let reversedCharacters = aString.characters.reverse()

// then convert back to a String with the String() initializer
let reversedString = String(reversedCharacters)

print(reversedString) // ".gnirts tset a si sihT"
3.0
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)

Stringhe maiuscole e minuscole

Per rendere tutti i caratteri in una stringa maiuscoli o minuscoli:

2.2
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
3.0
let text = "AaBbCc"
let uppercase = text.uppercased() // "AABBCC"
let lowercase = text.lowercased() // "aabbcc"

Controlla se String contiene caratteri da un Set definito

Lettere

3.0
let letters = CharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
   print("letters not found")
}
2.2
let letters = NSCharacterSet.letterCharacterSet()

let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
  print("letters not found")
}

La nuova struttura CharacterSet che è anche collegata alla classe NSCharacterSet Objective-C definisce diversi set predefiniti come:

  • decimalDigits
  • capitalizedLetters
  • alphanumerics
  • controlCharacters
  • illegalCharacters
  • e altro ancora puoi trovarlo nel riferimento NSCharacterSet .

Puoi anche definire il tuo set di caratteri:

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
   print("yes") 
}
else {
   print("no")
}
2.2
let charset = NSCharacterSet(charactersInString: "t")

if let _ = phrase.rangeOfCharacterFromSet(charset, options: .CaseInsensitiveSearch, range: nil) {
   print("yes")
}
else {
    print("no")
}

Puoi anche includere la gamma:

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive, range: phrase.startIndex..<phrase.endIndex)) {
   print("yes") 
}
else {
   print("no")
}

Conta le occorrenze di un personaggio in una stringa

Dato una String e un Character

let text = "Hello World"
let char: Character = "o"

Possiamo contare il numero di volte in cui il Character appare nella String usando

let sensitiveCount = text.characters.filter { $0 == char }.count // case-sensitive
let insensitiveCount = text.lowercaseString.characters.filter { $0 == Character(String(char).lowercaseString) } // case-insensitive

Rimuovi i caratteri da una stringa non definita in Set

2.2
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
   return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text, set: chars) // "SwiftComeOut"
3.0
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
  return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text: text, set: chars)

Formattare stringhe

Zeri leader

let number: Int = 7
let str1 = String(format: "%03d", number) // 007
let str2 = String(format: "%05d", number) // 00007

Numeri dopo decimale

let number: Float = 3.14159
let str1 = String(format: "%.2f", number) // 3.14
let str2 = String(format: "%.4f", number) // 3.1416 (rounded)

Da decimale a esadecimale

let number: Int = 13627
let str1 = String(format: "%2X", number) // 353B
let str2 = String(format: "%2x", number) // 353b (notice the lowercase b)

In alternativa si potrebbe usare l'inizializzatore specializzato che fa lo stesso:

let number: Int = 13627
let str1 = String(number, radix: 16, uppercase: true) //353B
let str2 = String(number, radix: 16) // 353b

Decimale a un numero con una radice arbitraria

let number: Int = 13627
let str1 = String(number, radix: 36) // aij

Radix è Int in [2, 36] .

Conversione di una stringa Swift in un tipo numerico

Int("123") // Returns 123 of Int type
Int("abcd") // Returns nil
Int("10") // Returns 10 of Int type
Int("10", radix: 2) // Returns 2 of Int type
Double("1.5") // Returns 1.5 of Double type
Double("abcd") // Returns nil

Si noti che ciò restituisce un valore Optional , che deve essere scartato di conseguenza prima di essere utilizzato.

Iterazione delle stringhe

3.0
let string = "My fantastic string"
var index = string.startIndex

while index != string.endIndex {
    print(string[index])
    index = index.successor()
}

Nota: endIndex è dopo la fine della stringa (cioè string[string.endIndex] è un errore, ma string[string.startIndex] va bene). Inoltre, in una stringa vuota ( "" ), string.startIndex == string.endIndex è true . Assicurati di controllare le stringhe vuote, dal momento che non puoi chiamare startIndex.successor() su una stringa vuota.

3.0

In Swift 3, gli indici String non hanno più successor() , predecessor() , advancedBy(_:) , advancedBy(_:limit:) o distanceTo(_:) .

Invece, quelle operazioni vengono spostate nella raccolta, che ora è responsabile per incrementare e decrementare i suoi indici.

I metodi disponibili sono .index(after:) , .index(before:) e .index(_:, offsetBy:) .

let string = "My fantastic string"
var currentIndex = string.startIndex

while currentIndex != string.endIndex {
    print(string[currentIndex])
    currentIndex = string.index(after: currentIndex)
}

Nota: stiamo usando currentIndex come nome di variabile per evitare confusione con il metodo .index .

E, per esempio, se vuoi andare dall'altra parte:

3.0
var index:String.Index? = string.endIndex.predecessor()

while index != nil {
    print(string[index!])
    if index != string.startIndex {
        index = index.predecessor()
    }
    else {
        index = nil
    }
}

(Oppure potresti solo invertire la stringa per prima, ma se non hai bisogno di andare fino in fondo nella stringa probabilmente preferiresti un metodo come questo)

3.0
var currentIndex: String.Index? = string.index(before: string.endIndex)

while currentIndex != nil {
    print(string[currentIndex!])
    if currentIndex != string.startIndex {
        currentIndex = string.index(before: currentIndex!)
    }
    else {
        currentIndex = nil
    }
}

Nota, Index è un tipo di oggetto e non un Int . Non è possibile accedere a un carattere di stringa come segue:

let string = "My string"
string[2] // can't do this
string.characters[2] // and also can't do this

Ma puoi ottenere un indice specifico come segue:

3.0
index = string.startIndex.advanceBy(2)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 2)

E può andare indietro come questo:

3.0
index = string.endIndex.advancedBy(-2)
3.0
currentIndex = string.index(string.endIndex, offsetBy: -2)

Se è possibile superare i limiti della stringa o se si desidera specificare un limite, è possibile utilizzare:

3.0
index = string.startIndex.advanceBy(20, limit: string.endIndex)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 20, limitedBy: string.endIndex)

In alternativa si può semplicemente scorrere i caratteri in una stringa, ma questo potrebbe essere meno utile a seconda del contesto:

for c in string.characters {
    print(c)
}

Rimuovi WhiteSpace iniziale e finale e NewLine

3.0
let someString = "  Swift Language  \n"
let trimmedString = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
// "Swift Language"

Metodo stringByTrimmingCharactersInSet restituisce una nuova stringa creata rimuovendo da entrambe le estremità dei caratteri String contenuti in un determinato set di caratteri.

Possiamo anche rimuovere solo spazi bianchi o newline.

Rimozione solo spazi bianchi:

let trimmedWhiteSpace = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// "Swift Language  \n"

Rimozione solo newline:

let trimmedNewLine = someString.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
// "  Swift Language  "
3.0
let someString = "  Swift Language  \n"

let trimmedString = someString.trimmingCharacters(in: .whitespacesAndNewlines)
// "Swift Language"

let trimmedWhiteSpace = someString.trimmingCharacters(in: .whitespaces)
// "Swift Language  \n"

let trimmedNewLine = someString.trimmingCharacters(in: .newlines)
// "  Swift Language  "

Nota: tutti questi metodi appartengono a Foundation . Usa import Foundation se Foundation non è già stato importato tramite altre librerie come Cocoa o UIKit.

Converti stringhe da e verso Dati / NSData

Per convertire String in e da Data / NSData è necessario codificare questa stringa con una codifica specifica. Il più famoso è UTF-8 che è una rappresentazione a 8 bit di caratteri Unicode, adatta per la trasmissione o l'archiviazione da parte di sistemi basati su ASCII. Ecco un elenco di tutte le String Encodings disponibili

String a Data / NSData

3.0
let data = string.data(using: .utf8)
2.2
let data = string.dataUsingEncoding(NSUTF8StringEncoding)

Data / NSData a String

3.0
let string = String(data: data, encoding: .utf8)
2.2
let string = String(data: data, encoding: NSUTF8StringEncoding)

Divisione di una stringa in una matrice

In Swift puoi facilmente separare una stringa in una matrice tagliandola in un determinato carattere:

3.0
let startDate = "23:51"

let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
2.2
let startDate = "23:51"

let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`

O quando il separatore non è presente:

3.0
let myText = "MyText"

let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
2.2
let myText = "MyText"

let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow