Swift: Enumate между разделами tableView и строкой - PullRequest
0 голосов
/ 06 июня 2019

Я хотел бы выбрать строку в табличном представлении. Но инсайд

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath.section {
        case 0:
            switch indexPath.row {
                case 0:
                    ...
            }
        ...
}

это я хотел бы повторить

private enum Section {
    case section0
    case section1
    ...
}

private enum Section0 {
    case section0row0
    case section0row1
    ...
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch Section(rawValue: indexPath.section)! {
        case .section0:
            switch Section0(rawValue: indexPath.row)! {
                case section0row0:
                    ...
            }
        ...
}

как это.

Может быть, есть лучший способ кодировать перечисления ... Кто-нибудь может мне сказать очень умное решение?

Спасибо:)

1 Ответ

0 голосов
/ 06 июня 2019

Есть множество способов решить эту проблему, один из самых простых, но не самый лучший, это массив действий

например:

import UIKit
import Foundation

typealias closure = ()->()

extension Collection {

    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}


struct ListOfAction {

    private var list: Array<Array<closure>>

    init() {
        self.list = [[]]
    }

    mutating func append(_ at: IndexPath,method:@escaping closure) {
        self.list[at.section].append(method)
    }

    mutating func insert(_ at: IndexPath,method:@escaping closure) {
        self.list[at.section].insert(method, at: at.row)
    }

    func call(at:IndexPath) {
        self.list[safe: at.section]?[safe: at.row]?()
    }

    func getClosure(at: IndexPath) -> closure? {
        return self.list[safe: at.section]?[safe: at.row]
    }
}


var listOfAction = ListOfAction()
var idx = IndexPath(row: 0, section: 0)
listOfAction.append(idx) {
    print("hello World")
}

listOfAction.insert(IndexPath(row: 1, section: 0)) {
    print("bye World")
}

listOfAction.call(at: IndexPath(row: 1, section: 0))
listOfAction.getClosure(at: idx)?()

примечание: в первую очередь вы должны заботиться о безопасности индекса; во-вторых, вы должны изменить ответ на основе ваших требований, чтобы стать неизменным или что-то еще. лучший способ - использовать универсальные методы.

...