Aggiornamento per Swift 4
In Swift 4, String
è di Collection
nuovo conforme a , quindi è possibile utilizzare dropFirst
e dropLast
tagliare l'inizio e la fine delle stringhe. Il risultato è di tipo Substring
, quindi devi passarlo al String
costruttore per ottenere un String
:
let str = "hello"
let result1 = String(str.dropFirst()) // "ello"
let result2 = String(str.dropLast()) // "hell"
dropFirst()
e dropLast()
prendi anche un Int
per specificare il numero di caratteri da eliminare:
let result3 = String(str.dropLast(3)) // "he"
let result4 = String(str.dropFirst(4)) // "o"
Se specifichi più caratteri da eliminare rispetto a quelli presenti nella stringa, il risultato sarà la stringa vuota ( ""
).
let result5 = String(str.dropFirst(10)) // ""
Aggiornamento per Swift 3
Se vuoi solo rimuovere il primo carattere e vuoi cambiare la stringa originale in posizione, vedi la risposta di @ MickMacCallum. Se vuoi creare una nuova stringa nel processo, usa substring(from:)
. Con un'estensione aString
, puoi nascondere la bruttezza substring(from:)
e substring(to:)
creare utili aggiunte per tagliare l'inizio e la fine di un 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"
Come dropFirst
e dropLast
prima di loro, queste funzioni andranno in crash se non ci sono abbastanza lettere disponibili nella stringa. Spetta al chiamante usarli correttamente. Questa è una decisione progettuale valida. Si potrebbe scriverli per restituire un optional che poi dovrebbe essere scartato dal chiamante.
Swift 2.x
Ahimè a Swift 2 , dropFirst
e dropLast
(la migliore soluzione precedente) non sono così conveniente come prima. Con un'estensione a String
, puoi nascondere la bruttezza disubstringFromIndex
e 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"
Piace dropFirst
e dropLast
prima di loro, queste funzioni andranno in crash se non ci sono abbastanza lettere disponibili nella stringa. Spetta al chiamante usarli correttamente. Questa è una decisione progettuale valida. Si potrebbe scriverli per restituire un optional che poi dovrebbe essere scartato dal chiamante.
In Swift 1.2 , dovrai chiamarechopPrefix
questo modo:
"hello".chopPrefix(count: 3) // "lo"
oppure puoi aggiungere un trattino basso _
alle definizioni di funzione per sopprimere il nome del parametro:
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
castingdisplay.text!
su NSString. Non sto dicendo che sia una buona soluzione, sto solo correggendo un possibile malinteso. Con NSString, puoi indicizzarlo con Int. - E il motivo per cui non puoi indicizzare con Int non è a causa di Unicode; è perché un carattere può essere costituito da più punti di codice composti.