Come evitare di ripetere una condizione in metodi che la usano in modo diverso?

2

Diciamo che ho un'app che mostra i dettagli di una persona. Ogni persona può avere zero o più numeri di telefono e zero o più note allegate ad esso. Pertanto, ho un'entità Core Data Person con relazioni uno-a-molti per l'entità Phone e l'entità Note . Voglio mostrarli in UITableView , dove c'è una sezione "telefoni" e una sezione "note".

Quindi, numberOfRowsInSection sarà simile a questo:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0: // Phones
        if self.person.phones.count > 0 {
            return self.person.phones.count
        } else {
            return 1 // We want a different cell to display "no phones"
        }
    case 1: // Notes
        if self.person.notes.count > 0 {
            return self.person.notes.count
        } else {
            return 1 // We want a different cell to display "no notes"
    default:
        return 0
    }
}

E cellForRowAt sarà simile a questo:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.section {
    case 0:
        if self.person.phones.count > 0 {
            return UITableViewCell.init(style: .default, reuseIdentifier: "PhoneNumberCell")
        } else {
            return UITableViewCell.init(style: .default, reuseIdentifier: "NoPhoneNumbersCell")
        }
    case 1:
        if self.person.notes.count > 0 {
            return UITableViewCell.init(style: .default, reuseIdentifier: "NoteCell")
        } else {
            return UITableViewCell.init(style: .default, reuseIdentifier: "NoNotesCell")
        }
    default:
        return UITableViewCell.init(style: .default, reuseIdentifier: "default")
    }
}

E quindi, puoi già indovinare, lo stesso codice si ripeterà per willDisplay :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    switch indexPath.section {
    case 0:
        if self.person.phones.count > 0 {
            // Configure Phone Cell
        } else {
            // Configure No Phones Cell
        }
    case 1:
        if self.person.notes.count > 0 {
            // Configure Note Cell
        } else {
            // Configure No Notes Cell
        }
    default: break
    }
}

Lo stesso vale per didSelectRowAt (e altri metodi delegato / origine dati) ma non ne copierò più qui.

Quello che voglio fare è eliminare questa lunga e ripetuta switch con l'istruzione if..else ma il problema è che in alcuni casi lo uso per restituire un numero, in altri una stringa e in altri per configurare semplicemente una cellula.

Qualcuno ha un'idea o un modello da consigliare per questo caso?

    
posta phi 11.10.2016 - 18:00
fonte

1 risposta

2

Ecco il tipo di sorgente dati che vorrei vedere per il tuo esempio:

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return sections[section].itemCount
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    return sections[indexPath.section].cell(forRow: indexPath.row)
}

Per far funzionare quanto sopra, avrai bisogno di un protocollo Section :

protocol Section {
    var itemCount: Int { get }
    var cell(forRow row: Int) -> UITableViewCell 
}

... così come PhoneNumberSection e NoteSection che entrambi implementano quel protocollo.

    
risposta data 08.05.2017 - 03:21
fonte

Leggi altre domande sui tag