Swift Language
Archi e personaggi
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.
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"
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"
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
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"
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)
Stringhe maiuscole e minuscole
Per rendere tutti i caratteri in una stringa maiuscoli o minuscoli:
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
let text = "AaBbCc"
let uppercase = text.uppercased() // "AABBCC"
let lowercase = text.lowercased() // "aabbcc"
Controlla se String contiene caratteri da un Set definito
Lettere
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")
}
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:
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")
if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
print("yes")
}
else {
print("no")
}
let charset = NSCharacterSet(charactersInString: "t")
if let _ = phrase.rangeOfCharacterFromSet(charset, options: .CaseInsensitiveSearch, range: nil) {
print("yes")
}
else {
print("no")
}
Puoi anche includere la gamma:
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
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"
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
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.
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:
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)
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:
index = string.startIndex.advanceBy(2)
currentIndex = string.index(string.startIndex, offsetBy: 2)
E può andare indietro come questo:
index = string.endIndex.advancedBy(-2)
currentIndex = string.index(string.endIndex, offsetBy: -2)
Se è possibile superare i limiti della stringa o se si desidera specificare un limite, è possibile utilizzare:
index = string.startIndex.advanceBy(20, limit: string.endIndex)
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
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 "
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
let data = string.data(using: .utf8)
let data = string.dataUsingEncoding(NSUTF8StringEncoding)
Data
/ NSData
a String
let string = String(data: data, encoding: .utf8)
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:
let startDate = "23:51"
let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
let startDate = "23:51"
let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`
O quando il separatore non è presente:
let myText = "MyText"
let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
let myText = "MyText"
let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]