2015-11-04 4 views
1
let cfg: UnsafeMutablePointer <pjsua_config> = nil; 
pjsua_config_default(cfg); 
cfg.cb // Error: Value of type 'UnsafeMutablePointer<pjsua_config>' has no member 'cb' 

Как нарисовать cfg для доступа к его полям? Я попытался найти ответ в Apple 'Interacting with C API' document , но нет информации, связанной с этой проблемой.Как получить доступ к UnsafeMutablePointer struct member

+0

как может быть ноль? – ogres

+0

@ogres a let может быть необязательным – azimov

+0

Я не вижу знака вопроса в конце вашего объявления, я уверен, что вы получите ошибку компилятора для этого кода – ogres

ответ

2

На самом деле является сопутствующей информацией в «взаимодействующей с API, C» главы:

Если функция объявлена ​​как принимает UnsafeMutablePointer<Type> аргумента , он может принимать любое из следующего:

  • ...
  • inout выражение, операнд является сохраняемым объект типа Type, который передается в качестве адреса Lvalue
  • ...

Таким образом, вы можете просто передать адрес из (инициализирован) pjsua_config структуры, как «Inout-параметра» с &, аналогично, как вы могли бы сделать в C:

var cfg = pjsua_config() // creates a `struct pjsua_config` with all fields set to zero 
pjsua_config_default(&cfg) 

Теперь вы можете получить доступ к cfg.cb, и вам не нужно беспокоиться о управлении памятью .

+0

cfg должен быть указателем на структуру, а не на структуру. pjsua_config_default() требует параметра типа «UnsafeMutablePointer ) ' – azimov

+0

@gottlieb: Да, я знаю. Вы попробовали? Не забудьте '&' в 'pjsua_config_default (& cfg)'. Я уверен, что он должен работать. –

+0

Нет, это не сработает. Сообщение об ошибке «& используется с аргументом non-inout типа UnsafeMutablePointer ». Хм, довольно понятно, почему. – azimov

0

Я не знаю, что вы делаете в

pjsua_config_default() метод, но, чтобы получить необработанные данные Шуд вызова памяти на указатель.

Пожалуйста, смотрите рабочий пример:

var pt : UnsafeMutablePointer<Int>? // Optional 

pt = UnsafeMutablePointer.alloc(1) 

pt!.initialize(22) 

pt!.memory // returns your value 

// Cleanup 
pt!.destroy() 
pt!.dealloc(1) 
pt! = nil 
Смежные вопросы