Warum gibt Swift einen unerwarteten Zeiger zurück, wenn ein optionaler String in einen UnsafePointer konvertiert wird?

Ich habe ein ungewöhnliches Verhalten festgestellt, als ich mit einer C-Bibliothek arbeitete, die Zeichenfolgen als @ aufnahconst char * (das zu Swift als @ konvertiert wiUnsafePointer<Int8>!); ein @ übergebString hat wie erwartet funktioniert, aber einString? schien die Eingabe zu verfälschen. Betrachten Sie den Test, den ich schrieb:

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)

Dies funktioniert wie erwartet und gibt eine nullterminierte Liste von UTF-8-Bytes für die Eingabezeichenfolge aus:72 101 108 108 111 0

Allerdings, wenn ich die Eingabe in eine optionale Zeichenfolge ändern, so dass es wird:

let input: String? = "Hello"

Ich erhalte eine völlig andere Menge von Werten im Ergebnis 176 39 78 23 1 0), obwohl ich erwarten würde, dass es das gleiche ist. Übergeben vonnil funktioniert wie erwartet.

Die Funktion der C-Bibliothek ermöglichtNULL anstelle einer Zeichenfolge, und ich möchte diese manchmal auch in Swift übergeben, daher ist es sinnvoll, dass die Eingabezeichenfolge optional ist.

Ist dies ein Fehler in Swift oder wurde Swift nicht für diesen Fall entwickelt? Was ist in jedem Fall die beste Lösung für diesen Fall?

Bearbeite

Es scheint etwas mit mehreren Argumenten zu tun zu haben. Die C-Funktion:

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]);
}

Schnell

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

multiString(input0, input1, input2, input3)

Ergebnisse in:

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

Es scheint, dass es einen Fehler gibt, wie Swift mit mehreren Argumenten umgeht.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage