Tutti gli esempi seguenti usano
var str = "Hello, playground"
Swift 4
Le stringhe hanno subito una revisione abbastanza grande in Swift 4. Quando ottieni subito una sottostringa da una stringa, ottieni un Substring
tipo indietro piuttosto che a String
. Perchè è questo? Le stringhe sono tipi di valore in Swift. Ciò significa che se si utilizza una stringa per crearne una nuova, è necessario copiarla. Questo è buono per la stabilità (nessun altro lo cambierà a tua insaputa) ma cattivo per l'efficienza.
Un sottostringa, d'altra parte, è un riferimento alla stringa originale da cui proviene. Ecco un'immagine dalla documentazione che lo illustra.
Non è necessaria alcuna copia, quindi è molto più efficiente da usare. Tuttavia, immagina di avere un sottostringa di dieci caratteri da una stringa di un milione di caratteri. Poiché il sottostringa fa riferimento alla stringa, il sistema dovrebbe trattenere l'intera stringa fintanto che la sottostringa è in giro. Pertanto, ogni volta che hai finito di manipolare il tuo sottostringa, convertilo in una stringa.
let myString = String(mySubstring)
Questo copierà solo la sottostringa e la memoria contenente la vecchia stringa può essere recuperata . I sottostringhe (come tipo) devono essere di breve durata.
Un altro grande miglioramento in Swift 4 è che le stringhe sono raccolte (di nuovo). Ciò significa che qualunque cosa tu possa fare in una Collezione, puoi farlo in una String (usa gli script, scorre i caratteri, filtra, ecc.).
I seguenti esempi mostrano come ottenere una sottostringa in Swift.
Ottenere sottostringhe
È possibile ottenere una stringa da una stringa utilizzando pedici o un certo numero di altri metodi (ad esempio, prefix
, suffix
, split
). Tuttavia, è ancora necessario utilizzare String.Index
e non un Int
indice per l'intervallo. (Vedi la mia altra risposta se hai bisogno di aiuto con quello.)
Inizio di una stringa
È possibile utilizzare un pedice (notare l'intervallo unilaterale di Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
oppure prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
o ancora più semplice:
let mySubstring = str.prefix(5) // Hello
Fine di una stringa
Usando i pedici:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
oppure suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
o ancora più semplice:
let mySubstring = str.suffix(10) // playground
Si noti che quando si utilizzava l' suffix(from: index)
ho dovuto contare indietro alla fine utilizzando -10
. Ciò non è necessario quando si utilizza semplicemente suffix(x)
, che accetta solo gli ultimi x
caratteri di una stringa.
Intervallo in una stringa
Anche in questo caso utilizziamo semplicemente i pedici qui.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Conversione Substring
inString
Non dimenticare, quando sei pronto per salvare la sottostringa, dovresti convertirla in un String
modo che la memoria della vecchia stringa possa essere ripulita.
let myString = String(mySubstring)
L'utilizzo di un Int
estensione di indice?
Sono titubante nell'utilizzare Int
un'estensione dell'indice basata dopo aver letto l'articolo Strings in Swift 3 di Airspeed Velocity e Ole Begemann. Sebbene in Swift 4, le stringhe siano raccolte, il team Swift non ha intenzionalmente utilizzato gli Int
indici. È ancora String.Index
. Ciò ha a che fare con i personaggi Swift composti da un numero variabile di punti di codice Unicode. L'indice effettivo deve essere calcolato in modo univoco per ogni stringa.
Devo dire che spero che il team Swift trovi un modo per sottrarsi String.Index
al futuro. Ma fino a loro scelgo di usare la loro API. Mi aiuta a ricordare che le manipolazioni di stringhe non sono solo semplici Int
ricerche di indice.