Search code examples
swiftstringcharacterascii

What's the simplest way to convert from a single character String to an ASCII value in Swift?


I just want to get the ASCII value of a single char string in Swift. This is how I'm currently doing it:

var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97

This is so ugly though. There must be a simpler way.


Solution

  • edit/update Swift 5.2 or later

    extension StringProtocol {
        var asciiValues: [UInt8] { compactMap(\.asciiValue) }
    }
    

    "abc".asciiValues  // [97, 98, 99]
    

    In Swift 5 you can use the new character properties isASCII and asciiValue

    Character("a").isASCII       // true
    Character("a").asciiValue    // 97
    
    Character("á").isASCII       // false
    Character("á").asciiValue    // nil
    

    Old answer

    You can create an extension:

    Swift 4.2 or later

    extension Character {
        var isAscii: Bool {
            return unicodeScalars.allSatisfy { $0.isASCII }
        }
        var ascii: UInt32? {
            return isAscii ? unicodeScalars.first?.value : nil
        }
    }
    

    extension StringProtocol {
        var asciiValues: [UInt32] {
            return compactMap { $0.ascii }
        }
    }
    

    Character("a").isAscii  // true
    Character("a").ascii    // 97
    
    Character("á").isAscii  // false
    Character("á").ascii    // nil
    
    "abc".asciiValues            // [97, 98, 99]
    "abc".asciiValues[0]         // 97
    "abc".asciiValues[1]         // 98
    "abc".asciiValues[2]         // 99