54

I've struggled and failed for over ten minutes here and I give in. I need to convert an Int to a Character in Swift and cannot solve it.

Question

How do you convert (cast) an Int (integer) to a Character (char) in Swift?

Illustrative Problem/Task Challenge

Generate a for loop which prints the letters 'A' through 'Z', e.g. something like this:

    for(var i:Int=0;i<26;i++) {      //Important to note - I know 
        print(Character('A' + i));   //this is horrendous syntax...
    }                                //just trying to illustrate! :)
Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
J-Dizzle
  • 4,861
  • 4
  • 40
  • 50

9 Answers9

49

You can't convert an integer directly to a Character instance, but you can go from integer to UnicodeScalar to Character and back again:

let startingValue = Int(("A" as UnicodeScalar).value) // 65
for i in 0 ..< 26 {
    print(Character(UnicodeScalar(i + startingValue)))
}
Nate Cook
  • 92,417
  • 32
  • 217
  • 178
  • 2
    That UnicodeScalar initializer is optional though, and that Character initializer doesn't take an optional. You have to do something more like `Character(UnicodeScalar(i + startingValue)!)` – jakehawken Sep 16 '19 at 15:14
12

How to convert an Int to a Character in Swift

For the sake of future visitors, I am providing a basic answer to the question title rather than the details of the question itself.

It is a two step process. Convert the Int to a UnicodeScalar and then convert the UnicodeScalar to a Character.

let myInteger: Int = 97

// convert Int to a valid UnicodeScalar
guard let myUnicodeScalar = UnicodeScalar(myInteger) else {
    return
}

// convert UnicodeScalar to Character
let myCharacter = Character(myUnicodeScalar)

// results
print(myCharacter) // a

(source)

Or alternatively...

if let myUnicodeScalar = UnicodeScalar(97) 
    let myCharacter = Character(myUnicodeScalar)
}

See also

Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
11

try this

for i in 0...25
{
    let string = String(format: "%c", i+65) as String
    NSLog("%@", string)
}
Saurabh Prajapati
  • 2,348
  • 1
  • 24
  • 42
9

So far I've come up with this:

for i in 0 ..< 26 {
    print(Character(UnicodeScalar(Int(UnicodeScalar("A").value) + i)))
}

If you're just trying to generate "A" to "Z", you can avoid the math and just do:

for c in UnicodeScalar("A").value...UnicodeScalar("Z").value {
    print(String(UnicodeScalar(c)))
}
vacawama
  • 150,663
  • 30
  • 266
  • 294
3

For helpful context, taking vacawama's and Nate Cook's UnicodeScalar to use -

 let startingValue = Int(UnicodeScalar("A").value)
 for i in 0..<26 {
    let itemStr = String(UnicodeScalar(i + startingValue))

    items.append("Item " + itemStr)
}
J-Dizzle
  • 4,861
  • 4
  • 40
  • 50
  • Ok fine... You are right and I hate that. Done! Here is the C-style if anyone wants it - – J-Dizzle Dec 14 '15 at 04:30
  • 1
    for(var i:Int=0; i<26; i++) { var itemStr:String = String(UnicodeScalar(i + startingValue)); items.append(String(format: "Item '%@'", itemStr)); } – J-Dizzle Dec 14 '15 at 04:30
  • 1
    good catch. I replaced the original "items.append(String(format: "Item '%@'", itemStr))" with your proposal of "items.append("Item " + itemStr) – J-Dizzle Dec 14 '15 at 04:56
3

Simply convert the integer into String, then convert string into Character

let number = 5
let numChar = Character(String(number))
Muhammad Aamir Ali
  • 20,419
  • 10
  • 66
  • 57
1

Here is an extension for Int to provide a correspondingLetter function :

extension Int {
    func correspondingLetter(inUppercase uppercase: Bool = false) -> String? {
        let firstLetter = uppercase ? "A" : "a"
        let startingValue = Int(UnicodeScalar(firstLetter)!.value)
        if let scalar = UnicodeScalar(self + startingValue) {
            return String(scalar)
        }
        return nil
    }
}

Note that if the int is larger then 26 you'll get special characters.

CedricSoubrie
  • 6,657
  • 2
  • 39
  • 44
1

New and updated

for charac in Unicode.Scalar("A").value...Unicode.Scalar("Z").value {
    print(Unicode.Scalar(charac)!, terminator:" ")}

prints:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

thx for the help from @vacawama, I like this version, for Swift(5) especially because of:

for charac in Unicode.Scalar("a").value...Unicode.Scalar("z").value {
    print(Unicode.Scalar(charac)!, terminator:" ")}

prints:

a b c d e f g h i j k l m n o p q r s t u v w x y z

and not having to look up, even tho we should know our unicode? haha etc...

rezwits
  • 835
  • 7
  • 12
0
//Current swift version is 5.7

//Prints character of unicode scaler 65
let num = 65
if let character = UnicodeScalar(num) {
    print(character) // prints A
}

//Similarly looping over 'a...z' 
let numRange = 97...122
for num in numRange {
    print("\(num) = \(UnicodeScalar(num)!)")
}