Почему 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 обрабатывает несколько аргументов.