example - swift ios basics
Lo que está mal aquí: el miembro de instancia no se puede usar en el tipo (3)
Esta pregunta ya tiene una respuesta aquí:
Tengo el siguiente código y estoy confundido acerca de este mensaje de error:
El miembro de instancia ''mydate'' no se puede usar en el tipo ''TableViewController''
Código:
class TableViewController: UITableViewController {
let mydate = NSDate()
let items = [
(1, 9, 7, "A", mydate),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
Cuando escribo lo siguiente, puedo compilarlo pero no sé por qué el fragmento de oder no funciona:
class TableViewController: UITableViewController {
let mydate = NSDate()
let items = [
(1, 9, 7, "A", nil),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
El compilador se confunde porque no conoce el tipo de NSDate
opcional. Puedes dejarlo saber explícitamente sobre el tipo.
let items : Array<(Int, Int, Int, String, NSDate?)> = [
(1, 9, 7, "A", nil),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
Editar: para el problema con el uso de la variable de instancia, puede inicializar sus elementos con un cierre.
let items : Array<(Int, Int, Int, String, NSDate?)> = {
let mydate = NSDate()
return [
(1, 9, 7, "A", nil),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
}()
El problema aquí es que estás usando self
antes de que la clase esté completamente inicializada. Puede tener un getter que se invocará cada vez que acceda a la variable o la calcule de forma perezosa.
Aquí hay un código:
class TableViewController: UITableViewController {
let mydate = NSDate()
var items : [(Int,Int,Int,String,NSDate)] {
get {
return [
(1, 9, 7, "A", mydate),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
}
}
}
Cálculo perezoso:
class TableViewController: UITableViewController {
let mydate = NSDate()
lazy var items : [(Int,Int,Int,String,NSDate)] = {
return [
(1, 9, 7, "A", self.mydate),
(2, 9, 7, "B", self.mydate),
(3, 9, 7, "C", self.mydate),
(4, 9, 7, "D", self.mydate)
]
}()
}
Puedes usar este código
var items:Array<(Int, Int, Int, String, NSDate)> {
get {
return [
(1, 9, 7, "A", mydate),
(2, 9, 7, "B", mydate),
(3, 9, 7, "C", mydate),
(4, 9, 7, "D", mydate)
]
}
}