Swift协议 - 代表是零,导致崩溃 - 不是关于选项

时间:2017-01-22 02:08:34

标签: ios swift delegates protocols

编辑:请仔细阅读。每个试图提供帮助的人都认为我在询问为什么一个零打开的可选项导致崩溃。我不是。我试图确定为什么它首先是零。感谢那些试图帮助的人!我很感激。

新手问题。我正在构建一个天气预报应用程序,作为学习在Swift中编程的一部分。

我有一个协议,用于将位置传回我的主预测类,用于返回某个位置的预测。我有两个不同的类别在返回位置时使用协议来返回预测。

我遇到了一个问题,其中一个类会因为委托给预测类而解包nil而导致崩溃。设置了完全相同的返回函数的另一个类没有此错误。我跟踪了崩溃到准备(对于segue:预测类中的函数。因为我不需要将信息传递给其中一个类,我没有设置 destinationViewController.delegate = self 崩溃的类。我的问题就是为什么我必须在预测类中设置它以防止打开无故障崩溃。

我知道我错过了为什么必须以这种方式设置协议的东西,但我似乎无法找到原因的答案。我想向我提出这个问题,并让其他人在发生这次崩溃时找到它。

我认为post解决了我的问题,但没有回答“为什么”,只回答“什么”。在启动segue的类中设置 destinationVC.delegate = self 做什么设置弱var委托:ForecastTableViewController!不会?

感谢。

我的代码如下:

ForecastTableViewController类:

class ForecastTableViewController: UITableViewController, CLLocationManagerDelegate, LocationToForecast {

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    getLocationNameAndStoreLocation(latitude: (self.weatherData.locationCoordinates.latitude), longitude: (self.weatherData.locationCoordinates.longitude))

    if segue.identifier == "locationViewSegue", let destinationViewController = segue.destination as? LocationViewController  {
        destinationViewController.delegate = self
        destinationViewController.weatherData = self.weatherData
        destinationViewController.wxObservationStationsArray = self.wxObservationStationsArray
        destinationViewController.newCoordinates = self.weatherData.locationCoordinates
    } else if segue.identifier == "searchPriorLocations", let destinationViewController = segue.destination as? SearchBarTableViewController  {
        destinationViewController.delegate = self
    }
}

LocationViewController类:

class LocationViewController: UIViewController, CLLocationManagerDelegate, UIGestureRecognizerDelegate, UIPickerViewDataSource, UIPickerViewDelegate {

    weak var delegate: ForecastTableViewController!


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    switch coordinateChoice {
    case currentLocationTrue: newCoordinates = currentLocation
    case UIPickerTrue:

        newCoordinates = UIPickerLocation

    case longPressTrue: newCoordinates = longPressLocation
    default: break
    }

    self.delegate!.returnLocationToForecast(locationToReturn: newCoordinates)
    performSegueToReturnBack()
}

SearchBarTableViewController类:

class SearchBarTableViewController: UITableViewController, UISearchResultsUpdating, NSFetchedResultsControllerDelegate {

    weak var delegate: ForecastTableViewController!


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    if !(newCoordinates.latitude == 0 && newCoordinates.longitude == 0) {
        self.delegate!.returnLocationToForecast(locationToReturn: newCoordinates)
    }

    performSegueToReturnBack()
}

2 个答案:

答案 0 :(得分:4)

  

我的问题就是为什么我必须在预测课程中设置它以防止打开无法崩溃

因为你说self.delegate!。那个意味着"如果我没有代表那就让我崩溃。"如果Swift 完全按照你说的去做,你不能抱怨!

如果您想要崩溃,那么不要说。请改为self.delegate?

答案 1 :(得分:0)

尝试使用 AnyObject 而不是class。在某些情况下,如果我们在非类对象中使用类,则可能会崩溃。

protocol DemoDelegate : AnyObject {   
}

class DemoViewController: UIViewController 
{

weak var delegate : DemoDelegate?

}