2014-09-12 18 views
8

Próbuję przekonwertować całkowitą reprezentację znaku ASCII na ciąg znaków.Konwertowanie na Char/String z Ascii Int w Swift

string += (char) int; 

W innych językach, takich jak Java (przykład tutaj) mogę po prostu rzucić integer w char. Swift najwyraźniej tego nie wie i domyślam się, że użycie wszechmocnego NSStringa w jakiś sposób będzie w stanie zrobić lewę.

Odpowiedz

20

To nie może być tak czyste jak Java, ale można to zrobić tak:

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

Można również zmodyfikować składnię wyglądać bardziej podobne, jeśli chcesz:

//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 za pomocą metody dasblinkenlight:

func += (inout left: String, right: Int) { 
    left += "\(UnicodeScalar(right))" 
} 
var string = "" 
string += 50 
+6

Może również użyć 's + =" \ (UnicodeScalar (x)) "' – dasblinkenlight

+0

To dobra uwaga. Aby go wyczyścić, możesz dodać operatora + = 'func + = (w lewym: String, right: Int) {left + =" \ (UnicodeScalar (right)) " }' – connor

+0

} czy istnieje sposób, aby uzyskać wartość dziesiętna od postaci w szybkim tempie –

2

Jeśli chcesz tylko znaki łańcuchowe z A ... możesz użyć tego func:

func characterFromInt(index : Int) -> String { 
     let startingValue = Int(("A" as UnicodeScalar).value) 
     var characterString = "" 
     characterString.append(Character(UnicodeScalar(startingValue + index))) 
     return characterString 
    } 
1

Oto produkcja gotowe rozwiązanie w 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 
    } 
} 

Zastosowanie:

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

Zauważ, że ten działa ze wszystkimi ASCII i codepoints Unicode, więc można to zrobić:

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

Jako osobista uwaga, nie użyłbym tego w moim kodzie. Spodziewałbym się, że ":" + 40 stanie się ":40", a nie ":(". Jeśli wolisz drugie, gdzie 40 stanie się , to powinno dobrze działać :)

Powiązane problemy