Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting to Char/String from Ascii Int in Swift

I'm trying to convert the integer representation of an ascii character back into a string.

string += (char) int;

In other languages like Java (the example here) I can just cast the integer into a char. Swift obviously does not know these and I'm guessing using the all powerful NSString somehow will be able to do the trick.

like image 754
Kilian Avatar asked Sep 12 '14 01:09

Kilian


3 Answers

It may not be as clean as Java, but you can do it like this:

var string = ""
string.append(Character(UnicodeScalar(50)))

You can also modify the syntax to look more similar if you like:

//extend Character so it can created from an int literal
extension Character: IntegerLiteralConvertible {
    public static func convertFromIntegerLiteral(value: IntegerLiteralType) -> Character {
        return Character(UnicodeScalar(value))
    }
}

//append a character to string with += operator
func += (inout left: String, right: Character) {
    left.append(right)
}

var string = ""
string += (50 as Character)

Or using dasblinkenlight's method:

func += (inout left: String, right: Int) {
    left += "\(UnicodeScalar(right))"
}
var string = ""
string += 50
like image 84
Connor Avatar answered Oct 27 '22 11:10

Connor


Here's a production-ready solution in Swift 3:

extension String {
    init(unicodeScalar: UnicodeScalar) {
        self.init(Character(unicodeScalar))
    }


    init?(unicodeCodepoint: Int) {
        if let unicodeScalar = UnicodeScalar(unicodeCodepoint) {
            self.init(unicodeScalar: unicodeScalar)
        } else {
            return nil
        }
    }


    static func +(lhs: String, rhs: Int) -> String {
        return lhs + String(unicodeCodepoint: rhs)!
    }


    static func +=(lhs: inout String, rhs: Int) {
        lhs = lhs + rhs
    }
}

Usage:

let a = String(unicodeCodepoint: 42) // "*"
var b = a + 126 // "*~"
b += 33 // "*~!"

Note that this works with all ASCII and Unicode codepoints, so you can do this:

var emoji = String(unicodeCodepoint: 0x1F469)! // "👩"
emoji += 0x200D // "👩‍"
emoji += 0x1F4BB // "👩‍💻"

As a personal note, I wouldn't use this in my code. I would have expected ":" + 40 to become ":40", not ":(". If you prefer the second one where 40 becomes "(", then this should work well for you :)

like image 34
Ky. Avatar answered Oct 27 '22 11:10

Ky.


If you want only String characters from A... you can use this func:

func characterFromInt(index : Int) -> String {
        let startingValue = Int(("A" as UnicodeScalar).value)
        var characterString = ""
        characterString.append(Character(UnicodeScalar(startingValue + index)))
        return characterString
    }
like image 2
Bisca Avatar answered Oct 27 '22 11:10

Bisca