【问题标题】:Converting Objective-C / C callback code to Swift将 Objective-C / C 回调代码转换为 Swift
【发布时间】:2016-08-03 20:14:27
【问题描述】:

我目前正在将一些较旧的 Objective-C 代码转换为 Swift,但遇到了一些 C 方面的问题。

我确实有一个需要回调函数的内部 API。

DoSomethingWithCallback(myCallbackType callback);

指定回调类型

typedef void(*myCallbackType)(struct customStruct *);

在我的 Objective-C / C 代码中,我刚刚添加了一个

static void functionThatActsAsCallback(struct customStruct *myStruct) {
 ..
}

并且可以用

调用所有内容
DoSomethingWithCallback(functionThatActsAsCallback);

我尝试通过创建回调函数将其转换为 Swift

func functionThatActsAsCallback(myStruct: UnsafePointer<customStruct>) -> Void {

}

并尝试通过

拨打电话
DoSomeThingWithCallback(functionThatActsAsCallback)

导致错误

无法将类型 '(UnsafePointer) -> Void' 的值转换为参数类型 'myCallbackType!'

我不太清楚为什么会出现这个错误以及如何解决这个问题。

提前感谢任何提示

【问题讨论】:

  • 描述类似问题的 SO 帖子很少:1, 2

标签: objective-c c swift callback typedef


【解决方案1】:

在使用它们之前,你应该检查你的类型和函数是如何导入到 Swift 中的。

如果您在单个 .h 文件中声明了所有类型和函数:

  • 等待 Xcode 成功索引您的项目。 (您可能需要注释掉错误行。)

  • 在 Xcode 编辑器中打开 .h 文件。

  • 单击编辑器窗格左上方的四个方形图标,然后选择“生成的接口”。

我可以通过我的示例项目得到这个:

public typealias myCallbackType = @convention(c) (UnsafeMutablePointer<customStruct>) -> Void

public func DoSomethingWithCallback(callback: myCallbackType!)

(您可以通过 Cmd 单击导入的类型名称或函数名称来找到它。)

所以,您的问题是由 UnsafePointerUnsafeMutablePointer 的类型不匹配引起的。修改你的回调函数为:

func functionThatActsAsCallback(myStruct: UnsafeMutablePointer<customStruct>) -> Void {

}

并将DoSomethingWithCallback 函数调用为:

DoSomethingWithCallback(functionThatActsAsCallback)

(匹配字母大小写。)


定义你的闭包:

let functionThatActsAsCallback: myCallbackType = {myStruct->Void in

}

帮助您找到 Swift 推断的参数类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多