Skip to content

Instantly share code, notes, and snippets.

@stevenschobert
Last active July 30, 2023 13:09
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save stevenschobert/540dd33e828461916c11 to your computer and use it in GitHub Desktop.
Save stevenschobert/540dd33e828461916c11 to your computer and use it in GitHub Desktop.
Camel-case a string in Swift
func camelCaseString(source: String) -> String {
if contains(source, " ") {
let first = source.substringToIndex(advance(source.startIndex, 1))
let cammel = NSString(format: "%@", (source as NSString).capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "", options: nil, range: nil)) as String
let rest = dropFirst(cammel)
return "\(first)\(rest)"
} else {
let first = (source as NSString).lowercaseString.substringToIndex(advance(source.startIndex, 1))
let rest = dropFirst(source)
return "\(first)\(rest)"
}
}
camelCaseString("os version")
camelCaseString("HelloWorld")
camelCaseString("someword With Characters")
extension String {
var camelCasedString: String {
let source = self
if contains(source, " ") {
let first = source.substringToIndex(advance(source.startIndex, 1))
let cammel = NSString(format: "%@", (source as NSString).capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "", options: nil, range: nil)) as String
let rest = dropFirst(cammel)
return "\(first)\(rest)"
} else {
let first = (source as NSString).lowercaseString.substringToIndex(advance(source.startIndex, 1))
let rest = dropFirst(source)
return "\(first)\(rest)"
}
}
}
"os version".camelCasedString
"HelloWorld".camelCasedString
"someword With Characters".camelCasedString
@cemolcay
Copy link

swift 2.1 version

extension String {
    var camelCasedString: String {
        let source = self
        if source.characters.contains(" ") {
            let first = source.substringToIndex(source.startIndex.advancedBy(1))
            let cammel = NSString(format: "%@", (source as NSString).capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "", options: [], range: nil)) as String
            let rest = String(cammel.characters.dropFirst())
            return "\(first)\(rest)"
        } else {
            let first = (source as NSString).lowercaseString.substringToIndex(source.startIndex.advancedBy(1))
            let rest = String(source.characters.dropFirst())
            return "\(first)\(rest)"
        }
    }
}

@mrgrauel
Copy link

Swift 2.2 Version without NSString

extension String {
    var camelcaseString: String {
        let source = self
        if source.characters.contains(" ") {
            let first = source.substringToIndex(source.startIndex.advancedBy(1))
            let cammel = source.capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "")
            let rest = String(cammel.characters.dropFirst())
            return "\(first)\(rest)"
        } else {
            let first = source.lowercaseString.substringToIndex(source.startIndex.advancedBy(1))
            let rest = String(source.characters.dropFirst())
            return "\(first)\(rest)"

        }
    }
}

@VivienGiraud
Copy link

Hi,
Thanks for this !
Just a small remark, it doesn't works as expected on uppercase string.EXAMPLE will be printed as eXAMPLE.
So I've updated it like that:

extension String {
    var camelcaseStringLowerCase: String {
        let source = self
        if source.characters.contains(" ") {
            let first = source.substringToIndex(source.startIndex.advancedBy(1))
            let cammel = source.capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "")
            let rest = String(cammel.characters.dropFirst())
            return "\(first)\(rest)"
        } else {
            let first = source.lowercaseString.substringToIndex(source.startIndex.advancedBy(1))
            let rest = String(source.characters.dropFirst())
            return "\(first)\(rest)"
        }
    }
    var camelcaseStringUpperCase: String {
        let source = self
        if source.characters.contains(" ") {
            let first = source.lowercaseString.substringToIndex(source.startIndex.advancedBy(1))
            let rest = String(source.characters.dropFirst())
            return "\(first)\(rest)"
        } else {
            let first = source.substringToIndex(source.startIndex.advancedBy(1))
            let cammel = source.capitalizedString.stringByReplacingOccurrencesOfString(" ", withString: "")
            let rest = String(cammel.characters.dropFirst())
            return "\(first)\(rest)"
        }
    }
}

Regards,
vIVIEN

@timbroder
Copy link

Updated for Swift 3/4

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

    var camelCasedString: String {
        return self.components(separatedBy: " ")
            .map { return $0.lowercased().capitalizingFirstLetter() }
            .joined()
    }

@Gatada
Copy link

Gatada commented Jun 21, 2019

Swift 5
I have a rather distinct feeling this can be done more efficiently, but at least this works:

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

    var upperCamelCased: String {
        return self.lowercased()
            .split(separator: " ")
            .map { return $0.lowercased().capitalizingFirstLetter() }
            .joined()
    }
    
    var lowerCamelCased: String {
        let upperCased = self.upperCamelCased
        return upperCased.prefix(1).lowercased() + upperCased.dropFirst()
    }
}

@MadsBogeskov
Copy link

MadsBogeskov commented May 20, 2021

For those that got a bit confused about the difference between upperCamelCased and lowerCamelCased. upper is PascalCasing, and lower is camelCasing. @Gatada Thanks for the snippet!

@Gatada
Copy link

Gatada commented May 20, 2021

PascalCasing - did not know that term, thanks. So that would mean pascalCased, right?

@ptrkstr
Copy link

ptrkstr commented Oct 13, 2021

@Gatada it's exactly like @MadsBogeskov wrote it.
Pascal Casing = PascalCasing
Camel Casing = camelCasing

@Gatada
Copy link

Gatada commented Oct 13, 2021

@Gatada it's exactly like @MadsBogeskov wrote it.
Pascal Casing = PascalCasing
Camel Casing = camelCasing

Hehe, yeah, in retrospect I see how my reply was confusing. I was referring to the method name, not the formatting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment