2014-09-12 14 views
8

Sto provando a convertire la rappresentazione intera di un carattere ASCII in una stringa.Conversione in Char/String da Ascii Int in Swift

string += (char) int; 

In altri linguaggi come Java (l'esempio qui) posso solo gettato il numero intero in un char. Ovviamente Swift non lo sa e immagino che usare il potentissimo NSString sarà in grado di fare il trucco.

risposta

20

Esso non può essere pulito come Java, ma si può fare in questo modo:

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

È inoltre possibile modificare la sintassi per guardare più simile se ti piace:

//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 utilizzando il metodo di dasblinkenlight:

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

Potrebbe anche usare 's + =" \ (UnicodeScalar (x)) "' – dasblinkenlight

+0

Questo è un buon punto. E per pulirlo, è possibile aggiungere l'operatore + = 'func + = (inout left: String, right: Int) {left + =" \ (UnicodeScalar (right)) " }' – connor

+0

c'è un modo per ottenere valore decimale dal carattere in rapido –

2

Se si desidera solo caratteri stringa da A ... è possibile utilizzare questa funzione:

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

Ecco una soluzione pronto per la produzione 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 // "*~!" 

Si noti che questo funziona con tutti ASCII e codepoints Unicode, in modo da può fare questo:

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

Come nota personale, non lo userei nel mio codice. Mi sarei aspettato che ":" + 40 diventasse ":40", non ":(". Se preferisci la seconda dove 40 diventa "(", allora questo dovrebbe funzionare bene per te :)