Что означает необязательная переменная <uninitialized>в контроллере представления? - PullRequest
2 голосов
/ 09 июля 2020

У меня есть контроллер представления, который показывает детали моей сущности "SkillGroup". Я хочу использовать это как для просмотра, так и для редактирования / создания «SkillGroup». Таким образом, у меня есть необязательная переменная skillGroup, которая либо не задана, либо равна нулю, когда вы впервые создаете SkillGroup и перед ее сохранением, ИЛИ она установлена, и вы будете просто просматривать SkillGroup. Вот мой код

class GroupViewController:UIViewController { 
    
    var skillGroup: SkillGroup?
    override func viewDidLoad() {
        super.viewDidLoad()
        if let skillGroup = skillGroup {
            self.title = skillGroup.name
        }
    }
}

и в предыдущем контроллере представления:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "createGroupSegue" {
        let destination = segue.destination as? GroupViewController
        destination?.createOrEdit = true
    }
    if segue.identifier == "showGroupSegue" {
        if let selectedGroupPath = self.groupsTableView.indexPathForSelectedRow {
            let destination = segue.destination as? GroupViewController
            destination?.createOrEdit = false
            let group = groups[selectedGroupPath.row]
            destination?.skillGroup = group
        }
    }
}

Если я устанавливаю точку останова сразу после вызова super и проверяю skillGroup, он говорит: <uninitialized>. Я не думаю об этом, потому что это «nil» как обычная необязательная переменная, которая не была установлена. Кроме того, я установил переменную skillGroup в коде подготовки к переходу.

Я действительно не могу найти много информации о том, что означает. Может ли кто-нибудь помочь мне здесь?

1 Ответ

2 голосов
/ 16 июля 2020

Я думаю, вы проверяете неправильную переменную в отладчике (локальную переменную вместо переменной экземпляра).

Я сделал быстрый образец:

class ViewController: UIViewController {
  public class TestClass {
    var foo: String
    var bar: Int
    
    init() {
      foo = "foo"
      bar = 4711
    }
  }
  
  public var test: TestClass?
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    test = TestClass()
    
    if let test = test {
      print(test.foo)
    }
  }
}

Когда я установил точка останова на строке if let test = test { Я увижу в отладчике следующее:

отладчик

Здесь вы можете видеть, что он напечатает <uninitialized>, когда я распечатаю описание локальной test переменной, потому что оператор let в этой строке еще не был выполнен.

Обратите внимание, что существует локальная переменная (живущая только внутри области if) и переменная экземпляра. В отладчике вы увидите переменные экземпляра, когда развернете узел self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...