Заглавная буква первого символа предложения (Swift)
У меня есть строковое описание, которое содержит мое предложение. Я хочу только заглавную букву. Я пробовал разные вещи, но большинство из них дают мне исключения и ошибки. Im с помощью Xcode 6.
вот что я пробовал до сих пор
let cap = [description.substringToIndex(advance(0,1))] as String
description = cap.uppercaseString + description.substringFromIndex(1)
это дает мне: введите ' String.Индекс "не соответствует протоколу "IntegerLiteralConvertible"
пробовал
func capitalizedStringWithLocale(locale:0) -> String
но я просто не могу понять, как заставить его работать. Есть идеи?
7 ответов
import Foundation
// A lowercase string
let description = "the quick brown fox jumps over the lazy dog."
// The start index is the first letter
let first = description.startIndex
// The rest of the string goes from the position after the first letter
// to the end.
let rest = advance(first,1)..<description.endIndex
// Glue these two ranges together, with the first uppercased, and you'll
// get the result you want. Note that I'm using description[first...first]
// to get the first letter because I want a String, not a Character, which
// is what you'd get with description[first].
let capitalised = description[first...first].uppercaseString + description[rest]
// Result: "The quick brown fox jumps over the lazy dog."
вы можете убедиться, что в вашем предложении есть хотя бы один символ, прежде чем вы начнете, так как в противном случае вы получите ошибку времени выполнения, пытаясь продвинуть индекс за конец строки.
в Swift 2, Вы можете сделать String(text.characters.first!).capitalizedString + String(text.characters.dropFirst())
еще одна возможность в Swift 3 -
extension String {
func capitalizeFirst() -> String {
let firstIndex = self.index(startIndex, offsetBy: 1)
return self.substring(to: firstIndex).capitalized + self.substring(from: firstIndex).lowercased()
}
}
редактировать для Swift 4
Предупреждения сверху Swift 3 code -
'substring (to:)' устарел: пожалуйста, используйте строковый индекс нарезки с оператором "partial range upto".
"substring (from:)" устарел: пожалуйста, используйте строковый индекс среза с оператором "partial range from".
Swift 4 решение -
extension String {
var capitalizedFirst: String {
guard !isEmpty else {
return self
}
let capitalizedFirstLetter = charAt(i: 0).uppercased()
let secondIndex = index(after: startIndex)
let remainingString = self[secondIndex..<endIndex]
let capitalizedString = "\(capitalizedFirstLetter)\(remainingString)"
return capitalizedString
}
}
вот как это сделать в Swift 4; на всякий случай, если это кому-то поможет:
extension String {
func captalizeFirstCharacter() -> String {
var result = self
let substr1 = String(self[startIndex]).uppercased()
result.replaceSubrange(...startIndex, with: substr1)
return result
}
}
Он не будет мутировать оригинал String
.
extension String {
var capitalizedFirstLetter:String {
let string = self
return string.replacingCharacters(in: startIndex...startIndex, with: String(self[startIndex]).capitalized)
}
}
let newSentence = sentence.capitalizedFirstLetter
для одного или каждого слова в строке, вы можете использовать строку .капитализированная собственность.
print("foo".capitalized) //prints: Foo
print("foo foo foo".capitalized) //prints: Foo Foo Foo
простейший soulution для Swift 4.0
добавить как вычисляемое расширение свойства
extension String {
var firstCapitalized: String {
var components = self.components(separatedBy: " ")
guard let first = components.first else {
return self
}
components[0] = first.capitalized
return components.joined(separator: " ")
}
}
использование
"hello world".firstCapitalized