Почему Swift возвращает неожиданный указатель при преобразовании необязательной строки в UnsafePointer?

Я заметил необычное поведение при работе с библиотекой C, которая воспринимала строки какconst char * (который преобразуется в Swift какUnsafePointer<Int8>!); прохождениеString работал как положено, ноString? казалось, испортил вход. Рассмотрим тест, который я написал:

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)

Это работает, как и ожидалось, печатая нулевой завершенный список байтов UTF-8 для входной строки:72 101 108 108 111 0

Тем не менее, если я изменю входные данные на необязательную строку, чтобы она стала:

let input: String? = "Hello"

Я получаю совершенно другой набор значений в результате (176 39 78 23 1 0), хотя я ожидаю, что это будет то же самое. Проходя вnil работает как положено.

Функция библиотеки C позволяетNULL вместо строки, и я иногда хочу передать это также в Swift, так что имеет смысл, чтобы входная строка была необязательной.

Это ошибка в Swift или Swift не был разработан для этого случая? В любом случае, как лучше всего справиться с этим делом?

редактировать

Похоже, что-то связано с несколькими аргументами. Функция 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]);
}

Swift:

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

multiString(input0, input1, input2, input3)

Результаты в:

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

Похоже, есть ошибка с тем, как Swift обрабатывает несколько аргументов.

Ответы на вопрос(3)

Ваш ответ на вопрос