[英]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.