Swift applica .uppercaseString solo alla prima lettera di una stringa


232

Sto cercando di creare un sistema di correzione automatica e quando un utente digita una parola con una lettera maiuscola, la correzione automatica non funziona. Per risolvere questo problema, ho creato una copia della stringa digitata, applicata .lowercaseString e quindi confrontata. Se la stringa è davvero errata, dovrebbe correggere la parola. Tuttavia, la parola che sostituisce la parola digitata è tutta in minuscolo. Quindi devo applicare .uppercaseString solo alla prima lettera. Inizialmente pensavo di poter usare

nameOfString[0]

ma a quanto pare non funziona. Come posso ottenere la prima lettera della stringa in maiuscolo e quindi poter stampare l'intera stringa con la prima lettera maiuscola?

Grazie per qualsiasi aiuto!

Risposte:


512

Incluse versioni mutanti e non mutanti coerenti con le linee guida API.

Swift 3:

extension String {
    func capitalizingFirstLetter() -> String {
        let first = String(characters.prefix(1)).capitalized
        let other = String(characters.dropFirst())
        return first + other
    }

    mutating func capitalizeFirstLetter() {
        self = self.capitalizingFirstLetter()
    }
}

Swift 4:

extension String {
    func capitalizingFirstLetter() -> String {
      return prefix(1).uppercased() + self.lowercased().dropFirst()
    }

    mutating func capitalizeFirstLetter() {
      self = self.capitalizingFirstLetter()
    }
}

3
Solo una nota che .capitalizedStringnon funziona più in Xcode 7 Beta 4. Le stringhe sono leggermente cambiate in Swift 2.0.
kakubei,

2
@Kirsteins: hai ragione, mia cattiva. Avevo dimenticato di importare un Foundation sorriso imbarazzato
kakubei,

3
@LoryLory Usalo .uppercaseStringper questo
Kirsteins l'

2
Questa è la risposta davvero efficace, amico ... Lavorare con Xcode 7.1.1 / Swift 2.1 .... Grazie :)
onCompletion

20
è solo .capitalizedora. Nota anchecapitalizedStringWith(_ locale:)
Raffaello

152

Swift 5.1 o successivo

extension StringProtocol {
    var firstUppercased: String { prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { prefix(1).capitalized + dropFirst() }
}

Swift 5

extension StringProtocol {
    var firstUppercased: String { return prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { return prefix(1).capitalized + dropFirst() }
}

"Swift".first  // "S"
"Swift".last   // "t"
"hello world!!!".firstUppercased  // "Hello world!!!"

"DŽ".firstCapitalized   // "Dž"
"Dž".firstCapitalized   // "Dž"
"dž".firstCapitalized   // "Dž"

3
Bel lavoro. Ho modificato il mio per passare prima in minuscolo e rinominato in Proprio.
ericgu,

Mi piace la soluzione rapida 2.1.1, ma quando eseguo la mia app e controllo la presenza di perdite, sta mostrando che sta perdendo.
Henny Lee,

1
Ho appena creato un nuovo progetto e sembra che causi una perdita di memoria quando questo viene utilizzato insieme a un UITextFieldosservatore per UITextFieldTextDidChangeNotification.
Henny Lee,

@ Henry, questo non ha nulla a che fare con il codice stesso. se si verificano problemi di prestazioni / memoria, è necessario segnalarlo ad Apple.
Leo Dabus,

1
@LeoDabus Immagino che dipenda da quale si rende più evidente l'intento del codice. La stringa vuota letterale è forse la migliore.
Nicolas Miari,

84

Swift 3.0

per "Hello World"

nameOfString.capitalized

o per "HELLO WORLD"

nameOfString.uppercased

3
Il Charlesism ha già risposto con la versione Swift 3 due mesi fa ...
Eric Aya,

11
Questo renderà maiuscolo il primo carattere di ogni parola della stringa e non solo la prima parola.
Bocaxica,

Restituisce: una copia maiuscola della stringa. public func uppercased () -> String Swift 3.0 o per "HELLO WORLD" nameOfString.uppercased INSTEAD OF ABOVE nameOfString.uppercased ()
Azharhussain Shaikh

40

Swift 4.0

string.capitalized(with: nil)

o

string.capitalized

Tuttavia, questa lettera maiuscola viene scritta in maiuscolo

Documentazione di Apple:

Una stringa maiuscola è una stringa con il primo carattere di ogni parola modificato nel corrispondente valore maiuscolo e tutti i caratteri rimanenti impostati sui corrispondenti valori minuscoli. Una "parola" è qualsiasi sequenza di caratteri delimitata da spazi, tabulazioni o terminatori di riga. Alcune parole comuni che delimitano la punteggiatura non vengono prese in considerazione, pertanto questa proprietà potrebbe non produrre generalmente i risultati desiderati per le stringhe con più parole. Vedere il metodo getLineStart (_: end: contentsEnd: for :) per ulteriori informazioni.


1
Non ho idea del perché le persone non siano ricettive a questa risposta. Se le persone vogliono solo la prima parola in maiuscolo, possono prendere la prima e capitalizzarla più facilmente con la proprietà in maiuscolo.
ScottyBlades,

1
È importante sottolineare che "maiuscolo" è corretto per tutti i caratteri Unicode, mentre non lo è usare "maiuscolo" per il primo carattere.
gnasher729,

23
extension String {
    func firstCharacterUpperCase() -> String? {
        let lowercaseString = self.lowercaseString

        return lowercaseString.stringByReplacingCharactersInRange(lowercaseString.startIndex...lowercaseString.startIndex, withString: String(lowercaseString[lowercaseString.startIndex]).uppercaseString)
    }
}

let x = "heLLo"
let m = x.firstCharacterUpperCase()

Per Swift 5:

extension String {
    func firstCharacterUpperCase() -> String? {
        guard !isEmpty else { return nil }
        let lowerCasedString = self.lowercased()
        return lowerCasedString.replacingCharacters(in: lowerCasedString.startIndex...lowerCasedString.startIndex, with: String(lowerCasedString[lowerCasedString.startIndex]).uppercased())
    }
}

Questa è la risposta migliore IMO: la rende semplice per tutti i casi futuri.
Robert

Non è necessario verificare se stringa isEmptye inizializzare una stringa per sostituirla. Puoi semplicemente scartare il primo personaggio e, nel caso fallisca, restituisci zero. Questo può essere semplificato comevar firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
Leo Dabus

17

Per il primo carattere in parole usare .capitalizedin rapido e per parole intere.uppercased()


10

Swift 2.0 (linea singola):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())

1
Upvoted. Tuttavia, ciò presuppone che la stringa originale sia tutta in minuscolo. Ho aggiunto .localizedLowercaseStringalla fine per farlo funzionare con stringhe come: aNYsTring. String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyalhi,

4

Swift 3 (xcode 8.3.3)

Metti in maiuscolo tutti i primi caratteri della stringa

let str = "your string"
let capStr = str.capitalized

//Your String

Metti in maiuscolo tutti i personaggi

let str = "your string"
let upStr = str.uppercased()

//YOUR STRING

Maiuscolo solo il primo carattere della stringa

 var str = "your string"
 let capStr = String(str.characters.prefix(1)).uppercased() + String(str.characters.dropFirst())

//Your string

Questo non metterà in maiuscolo solo il primo carattere di una stringa
Rool Paap,


3

Sto ottenendo il primo personaggio duplicato con la soluzione di Kirsteins. Questo renderà maiuscolo il primo personaggio, senza vedere il doppio:

var s: String = "hello world"
s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1)

Non so se sia più o meno efficiente, so solo che mi dà il risultato desiderato.


Puoi verificare se la maiuscola del primo carattere cambia quel carattere, salvandolo nella sua costante e testando l'uguaglianza con la nuova stringa "maiuscola", e se sono uguali allora hai già quello che vuoi.
David H,

Il tuo post ha ispirato questa risposta - grazie !: func capitaizeFirstChar (var s: String) -> String {if s.isEmpty == false {let range = s.startIndex ... s.startIndex let original = s.substringWithRange (range) let capitalized = original.capitalizedString se original == capitalized {return s} s.replaceRange (range, with: capitalized)} return s}
David H

1
Nelle nuove versioni di Swift, countElementsè giusto count.
George Poulos,

3

Da Swift 3 puoi facilmente usarlo textField.autocapitalizationType = UITextAutocapitalizationType.sentences


3

Ecco una versione di Swift 5 che utilizza l' API delle proprietà scalari Unicode per eseguire il salvataggio se la prima lettera è già in maiuscolo o non ha una nozione di caso:

extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}

Non è necessario inizializzare una stringa con il primo carattere. return first.uppercased() + dropFirst()o una fodera(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

2

Scrivi in ​​maiuscolo il primo carattere nella stringa

extension String {
    var capitalizeFirst: String {
        if self.characters.count == 0 {
            return self

        return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
    }
}

2

In Swift 3.0 (questo è un po 'più veloce e più sicuro della risposta accettata):

extension String {
    func firstCharacterUpperCase() -> String {
        if let firstCharacter = characters.first {
            return replacingCharacters(in: startIndex..<index(after: startIndex), with: String(firstCharacter).uppercased())
        }
        return ""
    }
}

nameOfString.capitalized non funzionerà , renderà maiuscole tutte le parole della frase


1

Crediti a Leonardo Savio Dabus:

Immagino che la maggior parte dei casi d'uso sia quella di ottenere l'involucro corretto:

import Foundation

extension String {

    var toProper:String {
        var result = lowercaseString
        result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
        return result
    }
}

1

La mia soluzione:

func firstCharacterUppercaseString(string: String) -> String {
    var str = string as NSString
    let firstUppercaseCharacter = str.substringToIndex(1).uppercaseString
    let firstUppercaseCharacterString = str.stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: firstUppercaseCharacter)
    return firstUppercaseCharacterString
}

Questo non è veloce.
Abhishek Bedi,

1

Incorporando le risposte sopra, ho scritto una piccola estensione che mette in maiuscolo la prima lettera di ogni parola (perché è quello che stavo cercando e ho pensato che qualcun altro potesse usarlo).

Umilmente invio:

extension String {
    var wordCaps:String {
        let listOfWords:[String] = self.componentsSeparatedByString(" ")
        var returnString: String = ""
        for word in listOfWords {
            if word != "" {
                var capWord = word.lowercaseString as String
                capWord.replaceRange(startIndex...startIndex, with: String(capWord[capWord.startIndex]).uppercaseString)
                returnString = returnString + capWord + " "
            }
        }
        if returnString.hasSuffix(" ") {
            returnString.removeAtIndex(returnString.endIndex.predecessor())
        }
        return returnString
    }
}

1
Swift String ha un metodo chiamato capitalizedString. Se è necessario applicarlo a un array di stringhe controllare questa risposta stackoverflow.com/a/28690655/2303865
Leo Dabus

1

Swift 4

func firstCharacterUpperCase() -> String {
        if self.count == 0 { return self }
        return prefix(1).uppercased() + dropFirst().lowercased()
    }

0

Ecco come l'ho fatto a piccoli passi, è simile a @Kirsteins.

func capitalizedPhrase(phrase:String) -> String {
    let firstCharIndex = advance(phrase.startIndex, 1)
    let firstChar = phrase.substringToIndex(firstCharIndex).uppercaseString
    let firstCharRange = phrase.startIndex..<firstCharIndex
    return phrase.stringByReplacingCharactersInRange(firstCharRange, withString: firstChar)
}

0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

Funziona anche semplicemente passare la stringa e recuperarne una maiuscola.


0

Swift 3 Update

La replaceRangefunzione è orareplaceSubrange

nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)

il metodo capitalizedString è stato rinominato in maiuscolo
Rool Paap il

0

Sono parziale a questa versione, che è una versione ripulita da un'altra risposta:

extension String {
  var capitalizedFirst: String {
    let characters = self.characters
    if let first = characters.first {
      return String(first).uppercased() + 
             String(characters.dropFirst())
    }
    return self
  }
}

Si sforza di essere più efficiente valutando i caratteri di sé solo una volta, quindi utilizza forme coerenti per creare le sottostringhe.


0

Swift 4 (Xcode 9.1)

extension String {
    var capEachWord: String {
        return self.split(separator: " ").map { word in
            return String([word.startIndex]).uppercased() + word.lowercased().dropFirst()
        }.joined(separator: " ")
    }
}

String ha già una proprietà chiamata capitalizedesattamente per questo scopo
Leo Dabus

0

Se vuoi scrivere in maiuscolo ogni parola di stringa puoi usare questa estensione

Swift 4 Xcode 9.2

extension String {
    var wordUppercased: String {
        var aryOfWord = self.split(separator: " ")
        aryOfWord =  aryOfWord.map({String($0.first!).uppercased() + $0.dropFirst()})
        return aryOfWord.joined(separator: " ")
    }
}

Usato

print("simple text example".wordUppercased) //output:: "Simple Text Example"

2
usa semplicemente.capitalized
kakubei il

0

Se la stringa è tutta maiuscola, il metodo seguente funzionerà

labelTitle.text = remarks?.lowercased().firstUppercased

Questa estensione ti aiuterà

extension StringProtocol {
    var firstUppercased: String {
        guard let first = first else { return "" }
        return String(first).uppercased() + dropFirst()
    }
}

1
usa semplicemente.capitalized
kakubei il

@kakubei Perché voti negativi. Questo metodo è per il caso Sentance. Le maiuscole trasformeranno ogni primo carattere della parola in maiuscolo. Esempio di stringa: - (QUESTO È UN RAGAZZO) .capitalizedrestituirà (Questo è un ragazzo) e questo metodo restituirà (Questo è un ragazzo) Entrambi sono diversi. (Per favore, fai + ve vota o rimuovi negativi)
Ashu,

Hai ragione @ashu, le mie scuse. Tuttavia non posso votare fino a quando non modifichi la risposta, quindi forse faccio solo una piccola modifica di spazio bianco e la voterò. Ancora una volta mi dispiace.
kakubei,

Non è necessario inizializzare una stringa con il primo carattere. return first.uppercased() + dropFirst()o un ritorno di linea(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

0

Aggiungi questa riga nel metodo viewDidLoad ().

 txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words

-1
extension String {
    var lowercased:String {
        var result = Array<Character>(self.characters);
        if let first = result.first { result[0] = Character(String(first).uppercaseString) }
        return String(result)
    }
}

-1

Per swift 5, puoi semplicemente fare così:

yourString.firstUppercased

Esempio: "abc" -> "Abc"


Non vi è alcuna prima proprietà sfruttata in Swift
Leo Dabus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.