Урок Detail view code update - isVisited - данные не отображаются


#1

Здравствуйте.
У меня возникла проблема в передаче данных isVisited.

Конструкция switch передает все кроме этого параметра.

switch indexPath.row {
        case 0:
            cell.keyLabel.text = "Название"
            cell.valueLabel.text = restaurant!.name
        case 1:
            cell.keyLabel.text = "Тип"
            cell.valueLabel.text = restaurant!.type
        case 3:
            cell.keyLabel.text = "Адрес"
            cell.valueLabel.text = restaurant!.location
        case 4:
            cell.keyLabel.text = "Я там был?"
            cell.valueLabel.text = restaurant!.isVisited ? "Да" : "Нет"
        default:
            break
        }

Вместо данных Был я там или нет отображается просто Key и Value
Делаю все как на видео. Подскажите, пожалуйста, в чем может быть проблема.


#2

Можете показать скриншот вывода и заодно покажите структуру Restaurant.


#3


#4

Когда почините проблему - переделайте switch. Сделайте

enum SomeType: Int {
   case name = 0
   case type = 1
//etc...
}

И в коде парсите уже enum а не цифры.


#5

в таком случае код увеличится, т.к. придется писать enumValue.rawValue
либо писать свой метод для вычисления ячейки

А вообще, если таблица такая простая и названия заголовков статичные, то можно все упростить. Метод cellForRowAt будет иметь только 5 строк. Но нужно будет создать свой словарь для заполнения.

Мой пример статичного словаря для класса

class SomeClass {
    ...

    var fields: [(key: String, value: String)] {
        return [
            ("Gender", gender),
            ("Age", age),
            ("Ethnicity", ethnicityName),
            
            ("Eye color", eyeColorName),
            ("Hair color", hairColorName),
            
            ("Height", fullHeight),
            ("Weight", "\(memberWeight) lbs")
        ]
    }
}

class ViewController {
    var someClass: SomeClass

    ...

    func tableView(cellForRowAt) {
        let cell = ...
        let cellData = someClass.fields[indexPath.row]

        cell.keyLabel.text = cellData.key
        cell.valueLabel.text = cellData.value

        return cell
    }
}

#6

Вы пропустили case 2 :slight_smile:


#7

Единственный кто заметил :slight_smile:


#8

Ой, действительно.
Всем спасибо :slightly_smiling_face:
Заработало


#9

ничего там не увеличиться. Просто уберем неопределенность в плане 0, 1 2 итп. А будем работать с нормальными объектами.


#10
switch indexPath.row {
   case 0:

против

let enum = SomeType(raw: indexPath.row)
switch enum {
    case name:

#11

Проблема в том что когда появится новое свойство оно у тебя во-первых в default свалиться.
А во-вторых, когда другой человек откроет код, он будет долго думать что это за 0, 1, 2…

Если ты пишешь код один сам для себя, тут вопросов ноль. Хоть в 1 классе все делай. Но как правило код пишется для людей, которые будет его ревьювить, дорабатывать и он должен быть самодокументируемым.


#12

Это все в теории :slight_smile:
На практике не всегда так выходит.


#13

Зависит от команды. Меня за хардкод бьют по рукам. Все должно быть так чтобы нельзя было сделать опечатку и чтобы все истолковывалось с точки зрения требований.