Swift применяется .uppercaseString только к первой букве строки
Я пытаюсь создать систему автокоррекции, и когда пользователь вводит слово с большой буквы, автозаполнение не работает. Чтобы исправить это, я сделал копию строки, набрав, применил .lowercaseString, а затем сравнил их. Если строка действительно ошибочна, она должна исправить слово. Однако тогда слово, которое заменяет введенное слово, имеет строчный регистр. Поэтому мне нужно применить .uppercaseString только к первой букве. Первоначально я думал, что могу использовать
nameOfString[0]
но это, по-видимому, не работает. Как я могу получить первую букву строки в верхнем регистре, а затем иметь возможность печатать полную строку с заглавной буквой?
Спасибо за любую помощь!
Ответы
Ответ 1
Включая изменяющиеся и не изменяющиеся версии, которые соответствуют рекомендациям API.
Свифт 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()
}
}
Свифт 4:
extension String {
func capitalizingFirstLetter() -> String {
return prefix(1).uppercased() + self.lowercased().dropFirst()
}
mutating func capitalizeFirstLetter() {
self = self.capitalizingFirstLetter()
}
}
Ответ 2
Swift 5 или позже
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ž"
Ответ 3
Swift 3.0
для "Hello World"
nameOfString.capitalized
или для "HELLO WORLD"
nameOfString.uppercased
Ответ 4
Swift 4.0
string.capitalized(with: nil)
или
string.capitalized
Однако это заглавные буквы первой буквы каждого слова
Документация Apple:
Заглавная строка - это строка с первым символом в каждом слове, измененным на соответствующее значение верхнего регистра, а все остальные символы установлены на соответствующие строчные значения. "Слово" - это любая последовательность символов, разделенных пробелами, вкладками или терминаторами строк. Некоторая распространенная пунктуация, ограничивающая слово, не учитывается, поэтому это свойство обычно не может давать желаемые результаты для многословных строк. Дополнительную информацию см. В методе getLineStart (_: end: contentsEnd: for:).
Ответ 5
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()
Для 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())
}
}
Ответ 6
Для первого символа в слове используйте .capitalized
в быстром и для целого слова .uppercased()
Ответ 7
Swift 2.0 (Single line):
String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
Ответ 8
Swift 3 (xcode 8.3.3)
Переносить все первые символы строки
let str = "your string"
let capStr = str.capitalized
//Your String
Введите все символы
let str = "your string"
let upStr = str.uppercased()
//YOUR STRING
Верхний только первый символ строки
var str = "your string"
let capStr = String(str.characters.prefix(1)).uppercased() + String(str.characters.dropFirst())
//Your string
Ответ 9
Я получаю первый символ, дублированный решением Kirsteins. Это будет использовать первый символ, не видя двойного:
var s: String = "hello world"
s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1)
Я не знаю, более или менее эффективен, я просто знаю, что он дает мне желаемый результат.
Ответ 10
В Swift 3 вы можете легко использовать textField.autocapitalizationType = UITextAutocapitalizationType.sentences
Ответ 11
Вот версия для Swift 5, которая использует API скалярных свойств Unicode для спасения, если первая буква уже в верхнем регистре или не имеет понятия case:
extension String {
func firstLetterUppercased() -> String {
guard let first = first, first.isLowercase else { return self }
return String(first).uppercased() + dropFirst()
}
}
Ответ 12
Быстро 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()
}
}
использовать со своей строкой
let test = "the rain in Spain"
print(test.capitalizingFirstLetter())
Ответ 13
Запишите первый символ в строке
extension String {
var capitalizeFirst: String {
if self.characters.count == 0 {
return self
return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
}
}
Ответ 14
Кредиты Леонардо Савио Дабусу:
Я предполагаю, что большинство случаев использования - это правильный корпус:
import Foundation
extension String {
var toProper:String {
var result = lowercaseString
result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
return result
}
}
Ответ 15
Мое решение:
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
}
Ответ 16
Включая ответы выше, я написал небольшое расширение, которое заглавные буквы первой буквы каждого слова (потому что то, что я искал, и полагал, что кто-то другой может его использовать).
Я смиренно представляю:
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
}
}
Ответ 17
В Swift 3.0 (это немного быстрее и безопаснее, чем принятый ответ):
extension String {
func firstCharacterUpperCase() -> String {
if let firstCharacter = characters.first {
return replacingCharacters(in: startIndex..<index(after: startIndex), with: String(firstCharacter).uppercased())
}
return ""
}
}
nameOfString.capitalized не будет работать, он будет использовать все слова в предложении
Ответ 18
Swift 4
func firstCharacterUpperCase() -> String {
if self.count == 0 { return self }
return prefix(1).uppercased() + dropFirst().lowercased()
}
Ответ 19
Для Swift 5 вы можете просто сделать следующее:
yourString.firstUppercased
Пример: "abc" → "Abc"
Ответ 20
Вот так я сделал это маленькими шагами, похожими на @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)
}
Ответ 21
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
return capString
}
Также работает только передать вашу строку и получить заглавную копию.
Ответ 22
Обновление Swift 3
Функция replaceRange
теперь replaceSubrange
nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
Ответ 23
Я частично отношусь к этой версии, которая является очищенной версией из другого ответа:
extension String {
var capitalizedFirst: String {
let characters = self.characters
if let first = characters.first {
return String(first).uppercased() +
String(characters.dropFirst())
}
return self
}
}
Он стремится быть более эффективным, только оценивая self.characters один раз, а затем использует согласованные формы для создания подстроки.
Ответ 24
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: " ")
}
}
Ответ 25
Если вы хотите использовать заглавные буквы в каждом слове строки, вы можете использовать это расширение
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: " ")
}
}
Используемый
print("simple text example".wordUppercased) //output:: "Simple Text Example"
Ответ 26
Если ваша строка написана заглавными буквами, то метод ниже
labelTitle.text = remarks?.lowercased().firstUppercased
Это расширение поможет вам
extension StringProtocol {
var firstUppercased: String {
guard let first = first else { return "" }
return String(first).uppercased() + dropFirst()
}
}
Ответ 27
Используйте медный шрифт из списка шрифтов в Xcode. Он автоматически преобразует первую букву в большую заглавную букву, а оставшуюся букву в маленькую заглавную. Пожалуйста, убедитесь, что при вводе текста делайте это по умолчанию, то есть с заглавной буквы и других маленьких букв.
Ответ 28
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)
}
}