在 Swift 中使用函数指针回调方法

时间:2021-08-01 15:52:16

标签: ios c swift function-pointers

我正在寻求更好地理解如何在 Swift 中实现这样的导入 C 函数。此错误消息很有帮助,但我已尝试将其作为 swift 函数中的参数的许多变体,但无法完全理解。

<块引用>

无法将类型“() -> ()”的值转换为预期的参数类型“method_handler?” (又名 'Optional<@convention(c) (Optional>, Optional, Optional>>, Int32, Optional) -> ()>')

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", &handler, nil, 0, 1);

1 个答案:

答案 0 :(得分:1)

如错误消息所述,您必须使用 @convention(c) 来定义可与其他 C 函数互操作的 swift 函数或闭包。试试这个:

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)