Заглавная буква первого символа предложения (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