Подтвердить что ты не робот

Какой самый простой способ конвертировать из одного символа String в значение ASCII в Swift?

Я просто хочу получить значение ASCII одной строки char в Swift. Вот как я это делаю сейчас:

var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97

Это так уродливо. Должен быть более простой способ.

4b9b3361

Ответ 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