Использование методов обратного вызова указателя функции в Swift

#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 это новая концепция для меня, которая, я не уверен, применима здесь в любом случае