Prepare for segue error

I originally used this code in my prepare for segue and it worked correctly:


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

if segue.identifier == "showDetail" {

let DetailViewController = segue.destination as! DetailViewController

let indexPath = tableView.indexPathForSelectedRow!

let selectedToDo = todos[indexPath.row]

DetailViewController.todo = selectedToDo

}

}


I am trying to add Master/Detail to my app so I modified my code below but now I get an Instance member 'todo' cannot be used on type 'DetailViewController' on the line below.


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

if segue.identifier == "showDetail" {

if let indexPath = tableView.indexPathForSelectedRow {

let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController

let selectedToDo = todos[indexPath.row]


DetailViewController.todo = selectedToDo <This is the line showing the error instance member cannot be used >


controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem

controller.navigationItem.leftItemsSupplementBackButton = true

}

}


Any idea where my error might be?

Answered by QuinceyMorris in 297586022

In the original version:


            let DetailViewController = segue.destination as! DetailViewController


You have a type (class) called "DetailViewController", but here you are shadowing (masking, hiding) that name by declaring a local variable with name "DetailViewController".


In the new version:


            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController


This time you called the local variable "controller", so "DetailViewController" isn't shadowed. So, in this:


DetailViewController.todo = selectedToDo


you're referring to the type (class), not the instance (object).


You're gonna run into problems like this if you capitalize variable names in Swift. The convention is to capitalize only types and protocols. Everything else should start with a lowercase letter.

Accepted Answer

In the original version:


            let DetailViewController = segue.destination as! DetailViewController


You have a type (class) called "DetailViewController", but here you are shadowing (masking, hiding) that name by declaring a local variable with name "DetailViewController".


In the new version:


            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController


This time you called the local variable "controller", so "DetailViewController" isn't shadowed. So, in this:


DetailViewController.todo = selectedToDo


you're referring to the type (class), not the instance (object).


You're gonna run into problems like this if you capitalize variable names in Swift. The convention is to capitalize only types and protocols. Everything else should start with a lowercase letter.

Prepare for segue error
 
 
Q