簡體   English   中英

Swift 協議 - 委托為零,導致崩潰 - 不是關於 Optionals

[英]Swift Protocols - Delegate Is Nil, Causing Crash - NOT About Optionals

編輯:請仔細閱讀。 每個試圖提供幫助的人都認為我在問為什么 nil unwrapped optional 會導致崩潰。 我不是。 我試圖確定為什么它首先是零。 並感謝那些試圖提供幫助的人! 我很感激。

新手問題。 我正在構建一個天氣預報應用程序,作為學習 Swift 編程的一部分。

我有一個協議,用於將位置傳遞回我的主要預測類,用於返回某個位置的預測。 我有兩個不同的分類,它們在返回位置以返回預測時使用該協議。

我遇到了一個問題,即其中一個類會導致解包 nil 時發生崩潰,因為委托給預測類。 使用完全相同的返回函數設置的另一個類沒有此錯誤。 我將崩潰追蹤到了prepare(for segue: function in the forecast class。因為我不需要將信息傳遞給其中一個類,所以我沒有為崩潰的類設置destinationViewController.delegate = self 。我的問題這就是為什么我必須在預測類中設置它以防止解包零崩潰。

我知道我錯過了為什么必須以這種方式設置協議的一些內容,但我似乎無法找到原因的答案。 我想為我和其他人提出這個問題,以找出崩潰發生的時間。

我認為這篇文章解決了我的問題,但沒有回答“為什么”,只是回答“什么”。 在啟動 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()
}

我的問題很簡單,為什么我必須在預測類中設置它以防止解包零崩潰

因為你說的是self.delegate! . 意味着“如果我沒有代表,就讓我崩潰”。 如果 Swift完全按照您說的去做,您就不能抱怨!

如果你不想崩潰,那就不要說 self.delegate? 反而。

嘗試使用AnyObject而不是 class 。 在某些情況下,如果我們在非類對象中使用類,它可能會崩潰。

protocol DemoDelegate : AnyObject {   
}

class DemoViewController: UIViewController 
{

weak var delegate : DemoDelegate?

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM