2017-08-09 79 views
-1

我正在使用Xcode 9 beta 5将我的项目迁移到swift 3.0 - 4.0,但得到了以下错误消息。 enter image description hereswift 4.0无法将类型'(_) - >()'的值转换为期望的参数类型(() - > Void)?

请帮忙解决,如果有人遇到这个问题。

@IBAction func refreshToLoadData() { 
     if !isDataPulled { 
      if !DemoModeManager.shared.isReachable { 
       self.showNetworkErrorWithCallback(screen: "Load Bags Info".localize(), okHandler: { (inner2) in do 
       { 
        self.okClick() 
        }}) 
      } else { 
       self.getDataForBags() 
      } 
     } else { 
      self.endRefreshing() 
      self.bagsTableView.reloadData() 
     } 
    } 


    func showNetworkErrorWithCallback(screen: String, okHandler: (() -> Void)?) { 
     let okAction = AlertAction("OK".localize(), { (okAction) in 
      okHandler?() 
     }) 
     showAlert(networkErrorTitle, message: networkErrorMessageFormat, preferredStyle: UIAlertControllerStyle.alert, animated: false, alertCompletion:nil, cancelAction: nil, otherActions: okAction) 
    } 
+1

请将代码添加为文字。但据我所知,你的'okHandler'被声明为'(() - > Void)?',忽略了Optional,一个不带参数的闭包类型。你为什么在闭包中放置一个参数'(inner2)'? – OOPer

回答

3

正如我在我的评论中提到的那样,您正在传递一个带有无参数的闭包参数参数的闭包。

只需删除无用参数:

@IBAction func refreshToLoadData() { 
    if !isDataPulled { 
     if !DemoModeManager.shared.isReachable { 
      self.showNetworkErrorWithCallback(screen: "Load Bags Info".localize(), okHandler: { 
       /* ### Do not put any arguments here" ### */ 
       do { 
        self.okClick() 
       } 
      }) 
     } else { 
      self.getDataForBags() 
     } 
    } else { 
     self.endRefreshing() 
     self.bagsTableView.reloadData() 
    } 
} 

在老斯威夫特,斯威夫特接受了一个参数,其类型为Void传递作为一个无参数的封闭的封闭。但是这样的行为从Swift 4中移除了。即使它在Swift 3中编译,你也应该认为这样的代码是一个超级糟糕的做法。

当您需要传递无参数的闭包时,不要放置参数。

相关问题