【问题标题】:Using Function pointer callback methods in Swift在 Swift 中使用函数指针回调方法
【发布时间】:2021-10-07 05:50:32
【问题描述】:

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

无法将类型“() -> ()”的值转换为预期的参数类型“method_handler?” (aka '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);

【问题讨论】:

    标签: ios c swift function-pointers


    【解决方案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)
    

    【讨论】:

    • 我收到 '&amp;' used with non-inout argument of type 错误 - 但将其从 &amp;handler 中删除可修复它。目前尚不清楚在这种情况下如何使用导入的 C 函数处理闭包。 inout 对我来说是一个新概念,我不确定是否适用于此
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多