Как преобразовать символ Unicode в Int в Swift

Пользователь спросил следующий вопрос один из моих ответов.

У меня есть символ юникода \u{0D85}. Как мне получить значение Int?

Я собирался отнести их к другому Qaru Q & A, но я не смог его найти. Они относятся к преобразованию другого направления:

И они, похоже, спрашивают, как преобразовать число в строковой форме в фактический Int (как при преобразовании "1" в 1).

Вместо того, чтобы пытаться подгонять мой ответ в комментарии к спрашивающему, я собираюсь дать ответ ниже. Тип \u{0D85} несколько неясен, но я расскажу о различных возможностях.

Ответ 1

Hex to Int

Если вы начинаете с \u{0D85}, и знаете шестнадцатеричное значение символа Юникода, вы можете записать его в следующем формате, потому что это уже Int.

let myInt = 0x0D85                          // Int: 3461

String to Int

Я предполагаю, что у вас есть "\u{0D85}" (в кавычках), что делает его String по умолчанию. И поскольку это String, вы не можете быть уверены, что в общем случае у вас будет только одно значение Int.

let myString = "\u{0D85}"

for element in myString.unicodeScalars {
    let myInt = element.value               // UInt32: 3461
}

Я мог бы также использовать myString.utf16 и let myInt = Int(element), но мне легче справляться с сканирующими значениями Unicode (UTF-32), когда есть возможность таких вещей, как emoji. (Подробнее см. этот ответ.)

Символ к Int

Swift Character, который является расширенным кластером grapheme, не имеет свойства utf16 или unicodeScalars, поэтому, если вы начинаете с Character, затем сначала конвертируете его в String, а затем следуете указаниям в разделе Строка в Int выше.

let myChar: Character = "\u{0D85}"
let myString = String(myChar)

Ответ 2

В Swift 5 Unicode.Scalar имеет свойство value. value имеет следующую декларацию:

Числовое представление скалярного Unicode.

var value: UInt32 { get }

Следующие примеры кодов Playground показывают, как unicodeScalars свойство unicodeScalars для Character или String и печатать значение Int32 каждого скаляра Unicode:

let char: Character = "\u{0D85}"

for scalar in char.unicodeScalars {
    print(scalar.value)
}

/*
 prints: 3461
 */
let str: String = "\u{0D85}"

for scalar in str.unicodeScalars {
    print(scalar.value)
}

/*
 prints: 3461
 */