Объяснение %02.2hhxв высоком голосе ответа :
%: Вводит xспецификатор конверсии.
02: Минимальная ширина преобразованного значения равна 2. Если преобразованное значение имеет меньше байтов, чем ширина поля, оно должно быть дополнено 0слева.
.2: Предоставляет минимальное количество цифр, отображаемых для xспецификатора преобразования.
hh: Указывает, что xспецификатор преобразования применяется к аргументу со знаком char или unsigned char (аргумент будет повышен в соответствии с целочисленными предложениями, но его значение должно быть преобразовано в char со знаком или unsigned char перед печатью).
x: Аргумент без знака должен быть преобразован в шестнадцатеричный формат без знака в стиле "dddd"; буквы "abcdef" используются. Точность определяет минимальное количество отображаемых цифр; если конвертируемое значение может быть представлено меньшим количеством цифр, оно должно быть расширено начальными нулями. Точность по умолчанию равна 1. Результатом преобразования нуля с явной точностью нуля не должно быть символов.
Для получения дополнительной информации см. Спецификацию IEEE printf .
Исходя из приведенного выше объяснения, я думаю, что лучше изменить %02.2hhxна %02xили %.2x.
Для Swift 5 возможны следующие методы:
deviceToken.map({String(format: "%02x", $0)}).joined()
deviceToken.map({String(format: "%.2x", $0)}).joined()
deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
deviceToken.reduce("", {$0 + String(format: "%.2x", $1)})
Тест выглядит следующим образом:
let deviceToken = (0..<32).reduce(Data(), {$0 + [$1]})
print(deviceToken.reduce("", {$0 + String(format: "%.2x", $1)}))
// Print content:
// 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
NSLog, тот, который печатаетnewDeviceToken?