Совместно используемая память в Swift и С/C++
Без прошлого нет будущего. Поэтому мы с заботой и любовью сохраняем наследие прошлого и используем проверенные инструменты в новых проектах. Благо, что разработчики Swift заложили возможность простого подключения библиотек, написанных на С, а с недавних пор еще и C++.

В статье были описаны небезопасные указатели и их взаимодействие с объектами Си. Но не прозвучал один важный, на мой взгляд, вопрос: где выделяется память под совместно используемые объекты. Из документации и руководств по Swift мной была усвоена настойчивая рекомендация использовать вместо выделения памяти на стороне Си, функцию allocate
класса UnsafeMutableRawPointer
, там где это возможно.
let buf = UnsafeMutableRawPointer.allocate(byteCount: 128, alignment: 4)
Для того, чтобы Swift понимал содержание памяти, нужно сделать её привязку к поддерживаемому типу. Многие базовые типы Си поддерживаются через классы Swift с созвучным названием (CBool, CChar, CDouble, CFloat, CInt, CLong, CLongLong, CShort, CSignedChar, CUnsignedChar, CUnsignedInt, CUnsignedLong и т.д.).
let sbuf = buf.bindMemory(to:CChar.self, capacity:128)
Последовательность символов CChar воспринимается языком Swift как строка в стиле Си, которая поддерживается конструктором класса строк, что упрощает, например, вывод строк:
print(String(cString:sbuf))
Осталось только напомнить, что надо явно освобождать память буферов после использования с помощью функции deallocate
:
buf.deallocate()
Спасибо за внимание!