структура typedef из C в Swift

Я работаю над приложением Swift, которое обращается к библиотеке C.

Файл .h содержит структуру typedef:

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY;

И есть метод в другом классе:

 -(int) initWithKey(CURRENT_DATA_KEY * key);

Мне нужно создать CURRENT_DATA_KEY в моем коде. Не уверен, как я могу добиться этого в Swift.

Есть старый код Objective-C, который использует:

CURRENT_DATA_KEY key = NULL;
initWithKey(key)

Я пытался:

let myKey = UnsafeMutablePointer<CURRENT_DATA_KEY>.allocate(capacity: 1)

Но когда я пытаюсь использовать его позже в качестве аргумента в функции, я получаю сообщение об ошибке:

Cannot convert value of type 'UnsafeMutablePointer<_DATA_KEY_>' (aka 'UnsafeMutablePointer(<OpaquePointer>)') to expected argument type 'UnsafeMutablePointer(<_DATA_KEY_?>!)'

Что похоже на то, что функция ожидает необязательное значение?

Я также пробовал:

let myKey: CURRENT_DATA_KEY? = nil
let myKey: CURRENT_DATA_KEY = NSNull()

Но они получают ошибки аналогичного типа.

Как создать: UnsafeMutablePointer(<_DATA_KEY_?>!)


person Buyin Brian    schedule 29.08.2017    source источник
comment
var myKey: CURRENT_DATA_KEY = nil работает?   -  person Charles Srstka    schedule 30.08.2017
comment
Нет, это не работает.   -  person Buyin Brian    schedule 30.08.2017


Ответы (1)


Прошло немного времени с тех пор, как я сделал это, но IIRC это:

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY;
-(int) initWithKey(CURRENT_DATA_KEY * key);

Фактически эквивалентен:

-(int) initWithKey(struct _DATA_KEY_ ** key);

Итак, если мы посмотрим на Взаимодействие с C API: указатели подпадает под:

Type **

Что становится:

AutoreleasingUnsafeMutablePointer<Type>

Если вы знакомы с членами C struct, вы можете обращаться с ним как со Swift struct и использовать синтезированный метод init. Итак, если это определено так:

struct _DATA_KEY_ { 
  int foo
};

В Swift это выглядит так:

public struct _DATA_KEY_ { 
  var foo: Int
  init()
  init(foo: Int)
}

И вы вызываете метод инициализации, например:

// no parameter
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_())

// parameter
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_(foo: 12))

Я не пробовал этот код, но я следовал совету в документе Apple раньше, и это сработало хорошо.

person Community    schedule 30.08.2017