2017-08-09 78 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中編譯,你也應該認爲這樣的代碼是一個超級糟糕的做法。

當您需要傳遞無參數的閉包時,不要放置參數。

相關問題