2015-06-07 5 views
0

Попытка использовать структуру от ObjC до Swift не кажется такой простой. Я получаю небезопасный указатель, который я не знаю, могу ли я надежно наложить.Передача структуры от ObjC до Swift

Вот код:

// 
// In OBJC land 
// 

// Type declared as a struct 

typedef struct node { 
    int children_count; 
} node_t; 

// Super class has a property 

@property (nonatomic, assign, readonly) node_t *node; 


// 
// In SWIFT land 
// 

// Derived class tries to set the property inside the C struct 


let n: UnsafeMutablePointer<node_t> = super.node // As swift compiler sees it 
n.children_count = 0 // ERR!!! 

ли мне действительно нужно применять unsafeBitcast здесь или есть более простой/безопаснее и более удобный способ, чтобы преобразовать то, что, как представляется, часто сценарий?

UPDATE:

Я попытался с помощью памяти для доступа к элементам структуры и я получаю EXC_BAD_INSTRUCTION

var node: node_t = self.node.memory 
node.children_count = 42 

UPDATE прод & ФИНАЛ

Я заработал. Благодаря терпению @ matt, чтобы убедиться, что я полностью проник в «память». Другой трюк, чтобы понять назначение в одном непрерывном заявлении вроде этого:

var node: UnsafeMutablePointer<node_t> = self.node 
    node.memory.children_count = 42 

Если я делаю следующее изменение не получает совершено передается вызов функции:

var node: node_t = self.node.memory 
node.children_count = 42 
+0

«Если я делаю следующее изменение не получает совершено передается вызов функции» Ах, очень хороший момент; да, потому что в Swift присвоение структуры 'node' вызывает копирование структуры. – matt

+0

Готово. Медленное воскресенье. Спасибо @matt – Laurent

+0

Спасибо, что присоединились к нему - я действительно был готов отправить вам демонстрационный проект, если вам это нужно! :) – matt

ответ

1

Одной из проблем является что это не «частый сценарий». На самом деле, это очень странно, что нужно сделать:

@property (nonatomic, assign, readonly) node_t *node; 

Эта вещь (node_t) является C структурой. Итак, для чего вам нужен указатель ? Возможно, у вас нет выбора по этому поводу, но далеко и далеко обычное дело просто иметь-структуру самого , как свойство:

@property (readonly) node_t *node; 

Таким образом, свойство прибывает как Свифт структура называется node_t, и если у вас есть ссылка var (а не let, как вы ее написали), вы можете назначить ее в свой children_count, как и следовало ожидать.

Если вы настаиваете на наличии указателя, вам придется разыграть указатель, не так ли? Вы этого не делаете. Для этого, возьмите указатель memory:

n.memory.children_count = 0 
+0

Спасибо за ваш ответ. Однако, как вы догадались, у меня нет выбора, кроме как использовать то, что там. Код наследуется от объектной структуры, которую я не могу изменить. Мне нужен способ как-то соединить структуру. Я надеюсь, что есть способ. – Laurent

+0

См. Мой пересмотренный ответ. - Да, я догадался. :) – matt

+0

Кроме того, вы уверены, что вам нужно 'супер'? Если мы являемся подклассом, мы наследуем эту переменную экземпляра, и 'self' должен работать. – matt

Смежные вопросы