如何使用 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
我正在尝试为 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