Что здесь не так: член экземпляра нельзя использовать по типу
У меня есть следующий код, и я смущен об этом сообщении об ошибке:
Член экземпляра 'mydate' не может использоваться для типа 'TableViewController'
код:
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)
]
Когда я пишу следующее, я могу его создать, но я не знаю, почему другой фрагмент не работает:
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)
]
Ответы
Ответ 1
Проблема заключается в том, что вы используете self
, прежде чем класс будет полностью инициализирован. Вы можете либо получить геттер, который будет вызываться каждый раз, когда вы обращаетесь к переменной, или вычисляете ее лениво.
Вот какой код:
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)
]
}
}
}
Ленивое вычисление:
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)
]
}()
}
Ответ 2
Вы можете использовать этот код
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)
]
}
}
Ответ 3
Компилятор запутывается, потому что он не знает тип необязательного NSDate
. Вы можете прямо сообщить об этом типе.
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)
]
Изменить: для проблемы с использованием переменной экземпляра вы можете инициализировать свои объекты закрытием.
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)
]
}()