J'essaie de créer un système de correction automatique et lorsqu'un utilisateur tape un mot avec une majuscule, la correction automatique ne fonctionne pas. Afin de résoudre ce problème, j'ai fait une copie de la chaîne typée, appliqué .lowercaseString, puis comparé. Si la chaîne est en effet mal typée, cela devrait corriger le mot. Cependant, le mot qui remplace le mot saisi est tout en minuscule. Je dois donc appliquer .uppercaseString à la première lettre seulement. Au départ, je pensais pouvoir utiliser
nameOfString[0]
mais cela ne fonctionne apparemment pas. Comment puis-je obtenir la première lettre de la chaîne en majuscule, puis pouvoir imprimer la chaîne complète avec la première lettre en majuscule?
Merci pour toute aide!
Incluant des versions mutantes et non mutantes conformes aux directives de l'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()
}
}
Swift 5 ou version ultérieure
extension StringProtocol {
var firstUppercased: String {
return prefix(1).uppercased() + dropFirst()
}
var firstCapitalized: String {
return prefix(1).capitalized + dropFirst()
}
}
Xcode 9 • Swift 4
extension StringProtocol {
var firstUppercased: String {
return prefix(1).uppercased() + dropFirst()
}
var firstCapitalized: String {
return String(prefix(1)).capitalized + dropFirst()
}
}
"Swift".first // "S"
"Swift".last // "t"
"hello world!!!".firstUppercased // "Hello world!!!"
"DŽ".firstCapitalized // "Dž"
"Dž".firstCapitalized // "Dž"
"dž".firstCapitalized // "Dž"
Swift 3.0
pour "Hello World"
nameOfString.capitalized
ou pour "BONJOUR MONDE"
nameOfString.uppercased
Swift 4.
string.capitalized(with: nil)
ou
string.capitalized
Cependant, cela capitalise la première lettre de chaque mot
Documentation d'Apple:
Une chaîne en majuscule est une chaîne avec le premier caractère de chaque mot remplacé par sa valeur majuscule correspondante et tous les caractères restants définis par leurs valeurs minuscules correspondantes. Un "mot" est une séquence de caractères délimitée par des espaces, des tabulations ou des fins de ligne. Certains signes de ponctuation délimitant Word courants ne sont pas pris en compte. Par conséquent, cette propriété peut ne pas générer les résultats souhaités pour les chaînes de plusieurs mots. Voir la méthode getLineStart (_: end: contentsEnd: for :) pour plus d'informations.
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()
Pour Swift 5:
extension String {
func firstCharacterUpperCase() -> String {
let lowerCasedString = self.lowercased()
return lowerCasedString.replacingCharacters(in: lowerCasedString.startIndex...lowerCasedString.startIndex, with: String(lowerCasedString[lowerCasedString.startIndex]).uppercased())
}
}
Pour le premier caractère de Word, utilisez .capitalized
dans Swift et pour Word entier, .uppercased()
.
Swift 2.0 (Une seule ligne):
String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
De Swift 3, vous pouvez facilement utiliser textField.autocapitalizationType = UITextAutocapitalizationType.sentences
Voici une version pour Swift 5 qui utilise le API de propriétés scalaires Unicode pour renflouer si la première lettre est déjà en majuscule, ou n'a pas de notion de cas:
extension String {
func firstLetterUppercased() -> String {
guard let first = first, first.isLowercase else { return self }
return String(first).uppercased() + dropFirst()
}
}
Swift 3 (xcode 8.3.3)
Mettre en majuscule tous les premiers caractères de la chaîne
let str = "your string"
let capStr = str.capitalized
//Your String
Mettre tous les caractères en majuscule
let str = "your string"
let upStr = str.uppercased()
//YOUR STRING
Premier caractère de la chaîne en majuscule
var str = "your string"
let capStr = String(str.characters.prefix(1)).uppercased() + String(str.characters.dropFirst())
//Your string
Je fais dupliquer le premier personnage avec la solution de Kirsteins. Cela va capitaliser le premier personnage, sans en voir double:
var s: String = "hello world"
s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1)
Je ne sais pas si c'est plus ou moins efficace, je sais juste que ça me donne le résultat souhaité.
Mettre en majuscule le premier caractère de la chaîne
extension String {
var capitalizeFirst: String {
if self.characters.count == 0 {
return self
return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
}
}
Crédits à Leonardo Savio Dabus:
J'imagine que la plupart des cas d'utilisation consistent à obtenir un boîtier adéquat:
import Foundation
extension String {
var toProper:String {
var result = lowercaseString
result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
return result
}
}
Dans Swift 3.0 (c'est un peu plus rapide et plus sûr que la réponse acceptée):
extension String {
func firstCharacterUpperCase() -> String {
if let firstCharacter = characters.first {
return replacingCharacters(in: startIndex..<index(after: startIndex), with: String(firstCharacter).uppercased())
}
return ""
}
}
nameOfString.capitalized ne fonctionnera pas, il mettra en majuscule tous les mots de la phrase
Ma solution:
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
}
Swift 4
func firstCharacterUpperCase() -> String {
if self.count == 0 { return self }
return prefix(1).uppercased() + dropFirst().lowercased()
}
Dans Swift 5
https://www.hackingwithswift.com/example-code/strings/how-to-capitalize-the-first-letter-of-a-string
extension String {
func capitalizingFirstLetter() -> String {
return prefix(1).capitalized + dropFirst()
}
mutating func capitalizeFirstLetter() {
self = self.capitalizingFirstLetter()
}
}
utiliser avec votre ficelle
let test = "the rain in Spain"
print(test.capitalizingFirstLetter())
En intégrant les réponses ci-dessus, j'ai écrit une petite extension qui met en majuscule la première lettre de chaque mot (car c'est ce que je cherchais et j'ai pensé que quelqu'un d'autre pourrait l'utiliser).
Je soumets humblement:
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
}
}
Je suis partial à cette version, qui est une version nettoyée d'une autre réponse:
extension String {
var capitalizedFirst: String {
let characters = self.characters
if let first = characters.first {
return String(first).uppercased() +
String(characters.dropFirst())
}
return self
}
}
Il s'efforce d'être plus efficace en n'évaluant qu'une seule fois les personnages indépendants. Il utilise ensuite des formulaires cohérents pour créer les sous-chaînes.
Si votre chaîne est en majuscule, la méthode ci-dessous fonctionnera
labelTitle.text = remarks?.lowercased().firstUppercased
Cette extension vous aidera
extension StringProtocol {
var firstUppercased: String {
guard let first = first else { return "" }
return String(first).uppercased() + dropFirst()
}
}
Si vous voulez mettre en majuscule chaque mot de chaîne, vous pouvez utiliser cette extension
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: " ")
}
}
tilisé
print("simple text example".wordUppercased) //output:: "Simple Text Example"
Mise à jour Swift
La replaceRange
func est maintenant replaceSubrange
nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
return capString
}
Cela fonctionne également, il suffit de passer votre chaîne et d’en récupérer une en majuscule.
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: " ")
}
}
Voici comment je l'ai fait par petites étapes, semblable à @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)
}