Какой самый простой способ конвертировать из одного символа String в значение ASCII в Swift?
Я просто хочу получить значение ASCII одной строки char в Swift. Вот как я это делаю сейчас:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
Это так уродливо. Должен быть более простой способ.
Ответы
Ответ 1
Вы можете создать расширение:
Xcode 8 • Swift 3
extension String {
var asciiArray: [UInt32] {
return unicodeScalars.filter{$0.isASCII}.map{$0.value}
}
}
extension Character {
var asciiValue: UInt32? {
return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
}
}
Character("a").asciiValue // 97
Character("á").asciiValue // nil
"abc".asciiArray // [97, 98, 99]
"abc".asciiArray[0] // 97
"abc".asciiArray[1] // 98
"abc".asciiArray[2] // 99
Ответ 2
Вы можете использовать NSString characterAtIndex, чтобы выполнить это...
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
Ответ 3
Теперь в Xcode 7.1 и Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
Ответ 4
Здесь моя реализация возвращает массив значений ASCII.
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
Примечание. Да, это совместимо с Swift 2.
Ответ 5
UnicodeScalar("1")!.value // returns 49
Swift 3.1
Ответ 6
Как вы это делаете правильно. Если вам не нравится многословие индексации, вы можете избежать этого путем циклического перехода через сканирующие юникоды:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
Фактически вы можете опустить break
в этом случае, конечно, так как существует только один скаляр в unicode.
Или, преобразуйтесь в массив и используйте индексирование Int (последнее средство отчаяния):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
Ответ 7
Несколько более короткий способ сделать это может быть:
first(singleChar.unicodeScalars)!.value
Как и в случае с версией подстроки, это приведет к сбою, если ваша строка фактически пуста, поэтому, если вы не уверены на 100%, используйте необязательный параметр:
if let ascii = first(singleChar.unicodeScalars)?.value {
}
Или, если вы хотите быть параноидальным,
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
Ответ 8
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1