我真的不知道怎么问这个问题,但是:
我在 Objective-C 和 Swift 之间架起了一座桥梁
在我的 Obj-C 类中调用我的 Swift 类
IAPbridge = [[IAPBridge alloc] init];
[IAPbridge requestProducts];
- 我有一门swift课
public func requestProducts () {
}
我的 Obj-C 类应该有一个 block 来从 Swift 类接收一些数据
应该是这样的(这段代码是错误的,但是我觉得应该是这样的)
objective-C
[IAPbridge requestProducts:^(id *products) {
NSLog(@"Response:%@", products);
}];
swift
public typealias ProductsRequestCompletionHandler = (_ products: [SKProduct]?) -> Void
private var productsRequestCompletionHandler: ProductsRequestCompletionHandler?
public func requestProducts (completionHandler) {
productsRequestCompletionHandler = completionHandler
productsRequestCompletionHandler?(true, products)
}
那么,有什么帮助吗?
最佳答案
按照您的规范,这部分是不可能的:
productsRequestCompletionHandler?(true, products)
如果 ProductsRequestCompletionHandler 仅采用一个值,则您不能返回两个值。因此,您将不得不修改 ProductsRequestCompletionHandler 的定义。
然后我们可以想象在 Swift 端我们有一个这样的类:
@objc class IAPBridge : NSObject {
public typealias ProductsRequestCompletionHandler = (Bool, [SKProduct]?) -> Void
@objc func requestProducts(_ ch:ProductsRequestCompletionHandler) {
let products : [SKProduct]? = // whatever
ch(true, products)
}
}
在 Objective-C 方面,您的类的 .m 文件必须导入隐式生成的桥接 header :
#import "MyApp-Swift.h" // or whatever it is called
在您的 Objective-C 类眼中,IAPBridge 具有以下方法:
- (void)requestProducts:(SWIFT_NOESCAPE void (^ _Nonnull)(BOOL, NSArray<SKProduct *> * _Nullable))ch;
所以现在你只需调用它:
IAPBridge* b = [[IAPBridge alloc] init];
[b requestProducts:^(BOOL success, NSArray<SKProduct *> * products) {
if (success) {
NSLog(@"Thank you for the products! They are %@", products);
} else {
NSLog(@"%@", @"Darn, something went wrong");
}
}];
关于ios - 如何将带有回调的 Objective-C 传递给 Swift 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565567/