Я знаю этот ответ, но это не одно и то же - это передача указателя для инициализации с помощью выделения.
Я взаимодействую с библиотекой C, которая имеет следующее определение структуры:
typedef struct myStruct { unsigned char var [50]; } myStruct;
Существует функция, с которой вы передаете адрес структуры - обычно на основе стека не находится куча, таким образом:
myStruct mine;
initMyStruct(&mine);
Это инициализирует содержимое структуры - вызывающий не знает внутренний формат памяти, следовательно, обфускацию.
В Swift я создаю класс, который инкапсулирует структуру и интерфейс с другими функциями C, которые работают на нем.
class MyClass {
var mine : myStruct
init() {
initMyStruct(&mine)
// Error: Variable 'self.msg' passed by reference before being initialized
}
}
Я не могу на всю жизнь понять, как инициализировать структуру, или использовать точку вместо этого, если это альтернатива.
mine = myStruct()
// Fails because you aren't providing the value of the member 'var'
mine = myStruct((CUnsignedChar(), CUnsignedChar(), /*... repeat to 50 */))
// Cannot find an overload for 'init' that accepts the arguments
Обратите внимание, что это передача адреса уже выделенной структуры (на основе стека) в функцию, которая была импортирована как
CInt initMyStruct(str: CMutablePointer<myStruct>)
Это НЕ передача указателя, который будет выделен библиотекой C, о которой идет речь, которая, по-видимому, является более распространенным требованием и ответит в другом месте.
В настоящее время Swift не поддерживает массивы с фиксированным размером.
Я не вижу, как удовлетворить инициализацию структуры или заставить Swift думать, что это будет сделано по вызову.
Любая помощь очень ценится!