簡體   English   中英

如何將帶有回調的Objective-C傳遞給Swift方法?

[英]How to pass an Objective-C with callback to a Swift method?

我真的不知道如何問這個問題,但是:

  1. 我在Objective-C和Swift之間架起了一座橋梁

  2. 在我的Obj-C類中,我調用了Swift類

IAPbridge = [[IAPBridge alloc] init];
[IAPbridge requestProducts];
  1. 我上課很快
public func requestProducts ()  {

}
  1. 我的Obj-C類應該有一個塊來從Swift類接收一些數據

  2. 應該是這樣的(此代碼是錯誤的,但是我認為應該是這樣的)

對象

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM