Explicación de %02.2hhxen la respuesta de alta votación :
%: Presenta el xespecificador de conversión.
02: El ancho mínimo del valor convertido es 2. Si el valor convertido tiene menos bytes que el ancho del campo, se rellenará 0a la izquierda.
.2: Proporciona el número mínimo de dígitos que deben aparecer para el xespecificador de conversión.
hh: Especifica que el xespecificador de conversión se aplica a un argumento con carácter firmado o sin signo (el argumento se habrá promocionado de acuerdo con las promociones de enteros, pero su valor se convertirá en carácter con signo o sin signo antes de imprimir).
x: El argumento sin signo se convertirá al formato hexadecimal sin signo en el estilo "dddd"; se usan las letras "abcdef". La precisión especifica el número mínimo de dígitos a aparecer; Si el valor que se está convirtiendo puede representarse en menos dígitos, se expandirá con ceros a la izquierda. La precisión predeterminada es 1. El resultado de convertir cero con una precisión explícita de cero no será caracteres.
Para obtener más detalles, consulte la especificación IEEE printf .
Basado en la explicación anterior, creo que es mejor cambiar %02.2hhxa %02xo %.2x.
Para Swift 5, los siguientes métodos son factibles:
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)})
La prueba es la siguiente:
let deviceToken = (0..<32).reduce(Data(), {$0 + [$1]})
print(deviceToken.reduce("", {$0 + String(format: "%.2x", $1)}))
// Print content:
// 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
NSLog, el que imprimenewDeviceToken?