Romaldowoho
Romaldowoho

Reputation: 415

How to capitalize the first character of sentence using Swift

I have a String description that holds my sentence and want to capitalize only the first letter. I tried different things but most of them give me exceptions and errors. I'm using Xcode 6.

Here is what I tried so far:

let cap = [description.substringToIndex(advance(0,1))] as String
    description = cap.uppercaseString + description.substringFromIndex(1)

It gives me:

Type 'String.Index' does not conform to protocol 'IntegerLiteralConvertible'

I tried:

 func capitalizedStringWithLocale(locale:0) -> String

But I haven't figured out how to make it work.

Upvotes: 7

Views: 14984

Answers (9)

cgeek
cgeek

Reputation: 578

extension String {
    var capitalizedFirstLetter:String {
          let string = self
          return string.replacingCharacters(in: startIndex...startIndex, with: String(self[startIndex]).capitalized)
    }
}

Answer:

let newSentence = sentence.capitalizedFirstLetter

Upvotes: 2

Sazzadhusen Iproliya
Sazzadhusen Iproliya

Reputation: 892

Swift 5.0

Answer 1:

extension String {
    func capitalizingFirstLetter() -> String {
        return prefix(1).capitalized + dropFirst()
     }

    mutating func capitalizeFirstLetter() {
        self = self.capitalizingFirstLetter()
    }
 }

Answer 2:

 extension String {
       func capitalizeFirstLetter() -> String {
            return self.prefix(1).capitalized + dropFirst()
       }
  }

Answer 3:

 extension String {
       var capitalizeFirstLetter:String {
            return self.prefix(1).capitalized + dropFirst()
       }
  }

Upvotes: 6

Jože Ws
Jože Ws

Reputation: 1814

Simplest soulution for Swift 4.0.

Add as a computed property extension:

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: " ")
    }
}

Usage:

"hello world".firstCapitalized

Upvotes: 0

Ajith Renjala
Ajith Renjala

Reputation: 5152

Another possibility in 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()
    }
}

For Swift 4:

Warnings from above Swift 3 code:

 'substring(to:)' is deprecated: Please use String slicing subscript
 with a 'partial range upto' operator.   
'substring(from:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator.  

Swift 4 solution:

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
    }
}

Upvotes: 5

Andreas
Andreas

Reputation: 183

In Swift 2, you can do

String(text.characters.first!).capitalizedString + String(text.characters.dropFirst())

Upvotes: 8

Jonny
Jonny

Reputation: 2074

Swift 4.2 version:

extension String {

    var firstCharCapitalized: String {
        switch count {
        case 0:
            return self
        case 1:
            return uppercased()
        default:
            return self[startIndex].uppercased() + self[index(after: startIndex)...]
        }
    }
}

Upvotes: 0

Pacyjent
Pacyjent

Reputation: 519

For one or each word in string, you can use String's .capitalized property.

print("foo".capitalized) //prints: Foo

print("foo foo foo".capitalized) //prints: Foo Foo Foo

Upvotes: 1

AydinAngouti
AydinAngouti

Reputation: 379

Here is how to do it in Swift 4; just in case if it helps anybody:

extension String {
    func captalizeFirstCharacter() -> String {
        var result = self

        let substr1 = String(self[startIndex]).uppercased()
        result.replaceSubrange(...startIndex, with: substr1)

        return result
    }
}

It won't mutate the original String.

Upvotes: 2

Matt Gibson
Matt Gibson

Reputation: 38238

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."

You may want to make sure there's at least one character in your sentence before you start, as otherwise you'll get a runtime error trying to advance the index beyond the end of the string.

Upvotes: 2

Related Questions