2014-09-22 78 views
0

我试图将我的应用程序从目标c转换为swift,并且除了应用程序购买工作外,我拥有一切。 我在项目导入的目标C辅助类,但是我无法做RequestProductsCompletionHandler部分iap - 从目标c到swift的转换

老客观C版我的代码

[[MTIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) { 
    if (success) { 
     _products = products; 

     if([[self appData] isPro] == FALSE) 
      [[self bUpgrade] setUserInteractionEnabled:TRUE]; 
    } 
}]; 

,我想将此部分转换为目标c,但到目前为止,我一直无法转换requestProductsWithCompletionHandler部分

任何人都可以帮忙吗?

我已经尝试创建一个使用

requestProductsWithCompletionHandler(sucess: Bool, products : NSArray) 

完成处理器相同的是在目标C,但我得到的编译器错误“额外的参数‘产品’呼叫”和“预期的会员名称或构造函数调用类型名称后“。 如果我尝试它没有参数我得到“参数#1在通话中缺少参数”

+0

你有什么试过,你到底在哪里跑到麻烦?你得到编译错误吗?运行时错误? – 2014-09-22 22:35:09

+0

我已经尝试创建完成处理程序与使用“requestProductsWithCompletionHandler(成功:Bool,产品:NSArray)”在目标c中一样“但我得到编译器错误”额外参数'产品'在调用“和”预期成员名称或类型名称后的构造函数调用“。如果我尝试它没有参数我得到“参数#1在通话中缺少参数” – 2014-09-22 22:39:40

+0

好的。如果您编辑了您的问题并添加了您随该错误一起尝试的代码,这将有所帮助。这样,我们更容易看到你来自哪里,并指向正确的方向。 – 2014-09-22 22:44:13

回答

2

在Swift中,您的完成处理程序将是closure。语法是半类似于Objective-C的块,但是,而不是定义块外的参数:

^(BOOL success, NSArray *products) { /* ... */ } 

你定义它们的闭包:

{ (success: Bool, products: [AnyObject]!) in /* ... */ } 

,那么你对requestProductsWithCompletionHandler通话应该是这个样子:

MTIAPHelper.sharedInstance().requestProductsWithCompletionHandler { 
    (success: Bool, products: [AnyObject]!) in 

    if success { 
     // etc. 
    } 
} 

您也可以让斯威夫特推断参数类型为您提供:

MTIAPHelper.sharedInstance().requestProductsWithCompletionHandler { 
    (success, products) in 

    if success { 
     // etc. 
    } 
} 
+0

很酷。我收到错误'[AnyObject]!'不是'NSArray'的子类型,虽然 – 2014-09-22 22:55:35

+0

对不起,我使用了错误的参数类型。请参阅编辑。 – 2014-09-22 23:05:54

+0

谢谢,让它工作 – 2014-09-22 23:11:30