#ios #c #swift #function-pointers
Вопрос:
Я стремлюсь лучше понять, как импортированные функции C, подобные этой, могут быть реализованы в Swift. Это сообщение об ошибке полезно, но я перепробовал множество вариантов этого в качестве параметров в функции swift и не могу его понять.
Не удается преобразовать значение типа «() — > () «в ожидаемый тип аргумента» method_handler? «(он же » Необязательно><@соглашение(c) (Необязательно<UnsafeMutablePointer<msg_data><msg_data>>, Необязательно<msg_data>><UnsafePointer>, Optional<UnsafePointer><UnsafeMutablePointer<Optional<UnsafeMutablePointer><UnsafeMutablePointer>><UnsafeMutablePointer>>>, Int32, необязательно) -<UnsafeMutablePointer>>>> ()<UnsafeMutablePointer>>>>>’)
typedef void (*method_handler)(const msg_data_ptr msg, const char *types,
arg_ptr *argv, int argc, void *user_data);
func handler(args)
{
for (i, arg) in args.enumerated() {
print("argument (i) is: (arg)")
}
}
прошел здесь:
add_handler_new("handler", amp;handler, nil, 0, 1);
Ответ №1:
Как говорится в сообщении об ошибке, вы должны использовать @convention(c)
для определения функции swift или закрытия, которая совместима с другими функциями языка C. Попробуйте это:
typealias MethodHandler = @convention(c) (
_ msg_data_ptr : UnsafeMutablePointer<msg_data>?,
_ types: UnsafePointer<Int8>?,
_ argv : UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?,
_ argc: Int32,
_ user_data: UnsafeMutablePointer<Int8>?
) -> Void
let handler: MethodHandler = { msg_data_ptr, types, argv, argc, user_data in
...
}
add_handler_new("handler", handler, nil, 0, 1)
Комментарии:
1. я получаю
'amp;' used with non-inout argument of type
ошибку, но удаление ее изamp;handler
исправляет ее. Было неясно, как закрытие обрабатывается в этом случае с помощью импортированной функции C.inout
это новая концепция для меня, которая, я не уверен, применима здесь в любом случае