【问题标题】:Error in conversion from Swift 2 to Swift 3从 Swift 2 转换为 Swift 3 时出错
【发布时间】:2016-09-21 09:24:16
【问题描述】:

这是我正在努力将 Swift 2 转换为 Swift 3 的第二个也是最后一个部分

旧的工作代码是

func calculateSegmentDirections(index: Int,
    time: NSTimeInterval, routes: [MKRoute]) {

    let request: MKDirectionsRequest = MKDirectionsRequest()
    request.source = locationArray[index].mapItem
    request.destination = locationArray[index+1].mapItem
    request.requestsAlternateRoutes = true
    request.transportType = .Automobile

    let directions = MKDirections(request: request)
    directions.calculateDirectionsWithCompletionHandler ({
      (response: MKDirectionsResponse?, error: NSError?) in
      if let routeResponse = response?.routes {
        let quickestRouteForSegment: MKRoute =
        routeResponse.sort({$0.expectedTravelTime <
          $1.expectedTravelTime})[0]

        var timeVar = time
        var routesVar = routes

        routesVar.append(quickestRouteForSegment)
        timeVar += quickestRouteForSegment.expectedTravelTime

        if index+2 < self.locationArray.count {
          self.calculateSegmentDirections(index+1, time: timeVar, routes: routesVar)
        } else {
          self.showRoute(routesVar, time: timeVar)
          self.hideActivityIndicator()
        }
      } else if let _ = error {
        let alert = UIAlertController(title: nil,
          message: "Directions not available.", preferredStyle: .Alert)
        let okButton = UIAlertAction(title: "OK",
          style: .Cancel) { (alert) -> Void in
            self.navigationController?.popViewControllerAnimated(true)
        }
        alert.addAction(okButton)
        self.presentViewController(alert, animated: true,
          completion: nil)
      }
    })
}

转换后的代码是

func calculateSegmentDirections(index: Int,
    time: NSTimeInterval, routes: [MKRoute]) {

    let request: MKDirectionsRequest = MKDirectionsRequest()
    request.source = locationArray[index].mapItem
    request.destination = locationArray[index+1].mapItem
    request.requestsAlternateRoutes = true
    request.transportType = .Automobile

    let directions = MKDirections(request: request)
    directions.calculateDirectionsWithCompletionHandler ({
      (response: MKDirectionsResponse?, error: NSError?) in
      if let routeResponse = response?.routes {
        let quickestRouteForSegment: MKRoute =
        routeResponse.sort({$0.expectedTravelTime <
          $1.expectedTravelTime})[0]

        var timeVar = time
        var routesVar = routes

        routesVar.append(quickestRouteForSegment)
        timeVar += quickestRouteForSegment.expectedTravelTime

        if index+2 < self.locationArray.count {
          self.calculateSegmentDirections(index+1, time: timeVar, routes: routesVar)
        } else {
          self.showRoute(routesVar, time: timeVar)
          self.hideActivityIndicator()
        }
      } else if let _ = error {
        let alert = UIAlertController(title: nil,
          message: "Directions not available.", preferredStyle: .Alert)
        let okButton = UIAlertAction(title: "OK",
          style: .Cancel) { (alert) -> Void in
            self.navigationController?.popViewControllerAnimated(true)
        }
        alert.addAction(okButton)
        self.presentViewController(alert, animated: true,
          completion: nil)
      }
    })
}

它在行上抛出一个错误

directions.calculateDirectionsWithCompletionHandler ({

错误是

无法将类型 '(MKDirectionsResponse?, NSError?) -> ()' 的值转换为预期的参数类型 'MKDirectionsHandler'(又名 '(Optional, Optional) -> ()')

如果有人可以帮助我,我将非常感激!

【问题讨论】:

  • 那些函数太长了。您应该在转换之前先重构它们。然后它将使它们更容易转换。

标签: swift3


【解决方案1】:

NSError 在 Swift 3.0 中重命名为 Error 这可能会解决您的问题。 这段代码为我编译:

func calculateSegmentDirections(index: Int,
                            time: TimeInterval, routes: [MKRoute]) {

    let request: MKDirectionsRequest = MKDirectionsRequest()
    request.source = locationArray[index].mapItem
    request.destination = locationArray[index+1].mapItem
    request.requestsAlternateRoutes = true
    request.transportType = .automobile

    let directions = MKDirections(request: request)
    directions.calculate (completionHandler: {
        (response: MKDirectionsResponse?, error: Error?) in
        if let routeResponse = response?.routes {
            let quickestRouteForSegment: MKRoute =
                routeResponse.sorted(by: {$0.expectedTravelTime <
                    $1.expectedTravelTime})[0]

            var timeVar = time
            var routesVar = routes

            routesVar.append(quickestRouteForSegment)
            timeVar += quickestRouteForSegment.expectedTravelTime

            if index+2 < self.locationArray.count {
                self.calculateSegmentDirections(index+1, time: timeVar, routes: routesVar)
            } else {
                self.showRoute(routesVar, time: timeVar)
                self.hideActivityIndicator()
            }
        } else
            if let _ = error {
                let alert = UIAlertController(title: nil,
                                          message: "Directions not available.", preferredStyle: .alert)
                let okButton = UIAlertAction(title: "OK",
                                     style: .Cancel) { (alert) -> Void in
                                            self.navigationController?.popViewControllerAnimated(true)
            }
            alert.addAction(okButton)
            self.presentViewController(alert, animated: true,
                                   completion: nil)
        }
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多