[英]How to pass an Objective-C with callback to a Swift method?
我真的不知道如何問這個問題,但是:
我在Objective-C和Swift之間架起了一座橋梁
在我的Obj-C類中,我調用了Swift類
IAPbridge = [[IAPBridge alloc] init];
[IAPbridge requestProducts];
public func requestProducts () {
}
我的Obj-C類應該有一個塊來從Swift類接收一些數據
應該是這樣的(此代碼是錯誤的,但是我認為應該是這樣的)
對象
[IAPbridge requestProducts:^(id *products) {
NSLog(@"Response:%@", products);
}];
迅速
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文件必須導入隱式生成的橋接標頭:
#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");
}
}];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.