Swift применяет .uppercaseString только к первой букве строки

182

Я пытаюсь создать систему автокоррекции, и когда пользователь вводит слово с большой буквы, автозаполнение не работает. Чтобы исправить это, я сделал копию строки, набрав, применил .lowercaseString, а затем сравнил их. Если строка действительно ошибочна, она должна исправить слово. Однако тогда слово, которое заменяет введенное слово, имеет строчный регистр. Поэтому мне нужно применить .uppercaseString только к первой букве. Первоначально я думал, что могу использовать

nameOfString[0]

но это, по-видимому, не работает. Как я могу получить первую букву строки в верхнем регистре, а затем иметь возможность печатать полную строку с заглавной буквой?

Спасибо за любую помощь!

Теги:
ios8-extension

25 ответов

422
Лучший ответ

Включая изменяющиеся и не изменяющиеся версии, которые соответствуют рекомендациям 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()
    }
}
  • 0
    Ты лучший! Я не знаю, почему Google не мог сказать мне это. Я не могу принять ответ в течение 9 минут, хотя. Спасибо!
  • 0
    обратите внимание, что это заглавная первая буква каждого слова
Показать ещё 15 комментариев
100

Xcode 9 • Swift 4

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

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

"DŽ".firstCapitalized   // "Dž"
"Dž".firstCapitalized   // "Dž"
"dž".firstCapitalized   // "Dž"
  • 2
    Хорошая работа. Я отредактировал мой, чтобы сначала пропустить строчные буквы, и переименовал в Proper.
  • 0
    Мне нравится решение swift 2.1.1, но когда я запускаю свое приложение и проверяю его на наличие утечек, оно показывает, что это утечка.
Показать ещё 10 комментариев
61

Swift 3.0

для "Hello World"

nameOfString.capitalized

или для "HELLO WORLD"

nameOfString.uppercased
  • 3
    Шарлизм уже ответил версией Swift 3 два месяца назад ...
  • 7
    Это будет использовать заглавные буквы первого символа каждого слова строки, а не только первое слово.
Показать ещё 2 комментария
26

Swift 4.0

string.capitalized(with: nil)

или

string.capitalized

Однако это заглавные буквы первой буквы каждого слова

Документация Apple:

Заглавная строка - это строка с первым символом в каждом слове, измененным на соответствующее значение верхнего регистра, а все остальные символы установлены на соответствующие строчные значения. "Слово" - это любая последовательность символов, разделенных пробелами, вкладками или терминаторами строк. Некоторая распространенная пунктуация, ограничивающая слово, не учитывается, поэтому это свойство обычно не может давать желаемые результаты для многословных строк. Дополнительную информацию см. В методе getLineStart (_: end: contentsEnd: for:).

  • 1
    Я понятия не имею, почему люди не воспринимают этот ответ. Если люди хотят, чтобы только первое слово было написано с заглавной буквы, они могли бы выхватить первое и легко использовать его с заглавной буквы.
  • 0
    Это должен быть принятый ответ
Показать ещё 1 комментарий
18
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()
  • 0
    Это лучший ответ IMO - он прост для всех будущих случаев.
9

Swift 2.0 (Single line):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
  • 1
    Upvoted. Тем не менее, это предполагает, что исходная строка все строчные. В конце я добавил .localizedLowercaseString чтобы он работал со строками типа: aNYsTring. String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
8

Для первого символа в слове используйте .capitalized в быстром и для целого слова .uppercased()

3

В Swift 3 вы можете легко использовать textField.autocapitalizationType = UITextAutocapitalizationType.sentences

3

Я получаю первый символ, дублированный решением Kirsteins. Это будет использовать первый символ, не видя двойного:

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

Я не знаю, более или менее эффективен, я просто знаю, что он дает мне желаемый результат.

  • 0
    Вы можете проверить, меняет ли этот символ заглавные буквы, сохранив его в своей собственной константе, а затем протестировав равенство с новой «заглавной» строкой, и, если они совпадают, у вас уже есть то, что вы хотите.
  • 0
    Ваш пост вдохновил на этот ответ - спасибо !: 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, если original == capitalized {return s} s.replaceRange (диапазон, с: прописными буквами)} return s}
Показать ещё 1 комментарий
2

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
  • 0
    Это не будет использовать только первый символ строки
2

Запишите первый символ в строке

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

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

Swift 4

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

В 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 не будет работать, он будет использовать все слова в предложении

1

Включая ответы выше, я написал небольшое расширение, которое заглавные буквы первой буквы каждого слова (потому что то, что я искал, и полагал, что кто-то другой может его использовать).

Я смиренно представляю:

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 имеет метод с именем capitalizedString. Если вам нужно применить его к массиву строк, проверьте этот ответ stackoverflow.com/a/28690655/2303865
1

Мое решение:

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
}
  • 0
    Это не чисто быстро.
1

Кредиты Леонардо Савио Дабусу:

Я предполагаю, что большинство случаев использования - это правильный корпус:

import Foundation

extension String {

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

Вот версия для Swift 5, которая использует API скалярных свойств Unicode для спасения, если первая буква уже в верхнем регистре или не имеет понятия case:

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

Если ваша строка написана заглавными буквами, то метод ниже

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

Это расширение поможет вам

extension StringProtocol {
    var firstUppercased: String {
        guard let first = first else { return "" }
        return String(first).uppercased() + dropFirst()
    }
}
  • 0
    просто используйте .capitalized
  • 0
    @kakubei Почему ты голосуешь против. Этот метод для случая Sentance. Прописная заглавная будет делать каждый первый символ слова к заглавной. Пример строки: - (ЭТО .capitalized ) .capitalized вернет (Это мальчик), и этот метод вернется (Это мальчик) Оба они разные. (Пожалуйста, проголосуйте + ve или удалите негатив)
Показать ещё 2 комментария
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: " ")
    }
}
0

Я частично отношусь к этой версии, которая является очищенной версией из другого ответа:

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 один раз, а затем использует согласованные формы для создания подстроки.

0

Обновление Swift 3

Функция replaceRange теперь replaceSubrange

nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
  • 0
    метод capitalizedString был переименован в прописной
0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

Также работает только передать вашу строку и получить заглавную копию.

0

Вот так я сделал это маленькими шагами, похожими на @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)
}
-1

Если вы хотите использовать заглавные буквы в каждом слове строки, вы можете использовать это расширение

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"
  • 0
    просто используйте .capitalized
-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)
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню