如何使用 C 的回调调用 Swift 函数

How to call a Swift function with a callback from C

我正在尝试为 Unity 编写一个 iOS 插件,这需要使用带有 C 层的桥。

插件本身是用Swift写的。

目前我的实现是这样的:

// Swift

@objc public class SomeClass  {

    @objc public func SomeFunction() -> String {
        return "Hello"
    }

}

// C

extern "C" {

    void _someFunction() {
        // I can access the Swift file using "[SomeClass shared]"
        // This returns the "Hello" string correctly
        NSString *helloMessage = [[SomeClass shared] SomeFunction];
    }

}

这可行,但现在我需要进行异步调用,这需要来自 Swift 实现的回调。

// Swift

@objc public class SomeClass  {

    @objc public func SomeFunction(completionHandler: (String) -> Void) {
        // Gets called after some async operations
        completionHandler(“hello”)
    }

}

是否可以从 C 层调用此 Swift 函数,您将如何调用?

// C

extern "C" {

    void _someFunction() {
        // ??????
    }

}

如果你设置好桥接那么调用应该是这样的

void _someFunction() {
    [[SomeClass shared] SomeFunctionWithCompletionHandler:^(NSString * _Nonnull value) {
        NSLog(@"Result: %@", value);
    }];
}

顺便说一句,类 在 Objective-C 中可见应该是 'is-a' NSObject,比如

@objcMembers public class SomeClass: NSObject  {

    public static var shared = SomeClass()

    public func SomeFunction() -> String {
        return "Hello"
    }

    public func SomeFunction(completionHandler: (String) -> Void) {
        // Gets called after some async operations
        completionHandler("hello")
    }

}

测试 Xcode 13.2 / iOS 15.2