¿Por qué Swift devuelve un puntero inesperado al convertir una cadena opcional en un puntero inseguro?

Noté un comportamiento inusual al trabajar con una biblioteca C que tomaba cadenas comoconst char * (que se convierte a Swift comoUnsafePointer<Int8>!); pasando unString funcionó como se esperaba, pero unString? pareció corromper la entrada. Considere la prueba que escribí:

func test(_ input: UnsafePointer<UInt8>?) {
    if let string = input {
        print(string[0], string[1], string[2], string[3], string[4], string[5])
    } else {
        print("nil")
    }
}

let input: String = "Hello"

test(input)

Esto funciona como se esperaba, imprimiendo una lista terminada en nulo de bytes UTF-8 para la cadena de entrada:72 101 108 108 111 0

Sin embargo, si cambio la entrada a una cadena opcional, para que se convierta en:

let input: String? = "Hello"

Obtengo un conjunto de valores completamente diferente en el resultado (176 39 78 23 1 0), aunque esperaría que fuera igual. Pasandonil Funciona como se esperaba.

La función de la biblioteca C permiteNULL en lugar de una cadena, y a veces quiero pasar eso también en Swift, por lo que tiene sentido que la cadena de entrada sea opcional.

¿Es esto un error en Swift, o Swift no fue diseñado para manejar este caso? De cualquier manera, ¿cuál es la mejor manera de manejar este caso?

Editar

Parece tener algo que ver con múltiples argumentos. La función C:

void multiString(const char *arg0, const char *arg1, const char *arg2, const char *arg3) {
    printf("%p: %c %c %c\n", arg0, arg0[0], arg0[1], arg0[2]);
    printf("%p: %c %c %c\n", arg1, arg1[0], arg1[1], arg1[2]);
    printf("%p: %c %c %c\n", arg2, arg2[0], arg2[1], arg2[2]);
    printf("%p: %c %c %c\n", arg3, arg3[0], arg3[1], arg3[2]);
}

Rápido:

let input0: String? = "Zero"
let input1: String? = "One"
let input2: String? = "Two"
let input3: String? = "Three"

multiString(input0, input1, input2, input3)

Resultados en:

0x101003170: T h r
0x101003170: T h r
0x101003170: T h r
0x101003170: T h r

Parece que hay un error en cómo Swift maneja múltiples argumentos.

Respuestas a la pregunta(3)

Su respuesta a la pregunta