Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios as TableView数据源的Swift通用枚举_Ios_Swift_Enums - Fatal编程技术网

Ios as TableView数据源的Swift通用枚举

Ios as TableView数据源的Swift通用枚举,ios,swift,enums,Ios,Swift,Enums,我想创建一个UITableViewController,它接受一个enum作为它的数据源。 问题是,我希望它能够处理相当多的enum 我创建了一个名为tableviewselectible的协议,并创建了一些符合该协议的enum,如下所示: protocol TableViewSelectable { } enum Genders: Int, TableViewSelectable { case male = 0, female static let allKeys = [

我想创建一个UITableViewController,它接受一个
enum
作为它的数据源。 问题是,我希望它能够处理相当多的
enum

我创建了一个名为
tableviewselectible
的协议,并创建了一些符合该协议的
enum
,如下所示:

protocol TableViewSelectable {

}

enum Genders: Int, TableViewSelectable {
    case male = 0, female

    static let allKeys = [male, female]
    static let allNames = [male.getName, female.getName]

    var getName: String {
        switch self {
        case .male:
            return "Male"
        case .female:
            return "Female"
        }
    }
}

enum Goals: Int, TableViewSelectable {
    case gainMuscleMass, getTrimFit, loseWeight

    static let allKeys = [gainMuscleMass, getTrimFit, loseWeight]
    static let allNames = [gainMuscleMass.getName, getTrimFit.getName, loseWeight.getName]

    var getName: String {
        switch self {
        case .gainMuscleMass:
            return "Gain muscle mass"
        case .getTrimFit:
            return "Get trim & fit"
        case .loseWeight:
            return "Lose weight"
        }
    }
}
我在我的
UITableViewController
上创建了一个实例变量,如下所示:

class ChoiceListTableViewController: UITableViewController {

    var data: TableViewSelectable?

}
问题是我不知道该怎么走。 我想要的是,提供符合
tableviewselectible
UITableViewController
任何
enum
的选项,以便用作其数据源

我想在
UITableViewController
上访问它,如下所示:

final class ChoiceListTableViewController: UITableViewController {

    var data: TableViewSelectable?


    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        self.clearsSelectionOnViewWillAppear = false
    }

}

// MARK: Table View Data Source & Delegate

extension ChoiceListTableViewController {

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return data.allKeys.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ChoiceTableViewCell", for: indexPath)

        cell.textLabel?.text = data.allNames[indexPath.row]

        return cell
    }

}

请帮忙?:)

当前实现的问题是,应该在
UITableViewDataSource
方法中使用的
allKeys
allNames
静态属性不是
TableViewSelectable
协议的一部分,因此不能使用
data
变量访问它们

您应该修改协议以包括这些

protocol TableViewSelectable {
    static var allKeys: [TableViewSelectable] {get}
    static var allNames: [String] {get}
}
您还需要相应地修改符合它的
enum
s

enum Genders: Int, TableViewSelectable {
    case male = 0, female

    static let allKeys:[TableViewSelectable] = [male, female]
    static let allNames = [male.getName, female.getName]

    var getName: String {
        switch self {
        case .male:
            return "Male"
        case .female:
            return "Female"
        }
    }
}

enum Goals: Int, TableViewSelectable {
    case gainMuscleMass, getTrimFit, loseWeight

    static let allKeys:[TableViewSelectable] = [gainMuscleMass, getTrimFit, loseWeight]
    static let allNames = [gainMuscleMass.getName, getTrimFit.getName, loseWeight.getName]

    var getName: String {
        switch self {
        case .gainMuscleMass:
            return "Gain muscle mass"
        case .getTrimFit:
            return "Get trim & fit"
        case .loseWeight:
            return "Lose weight"
        }
    }
}
然后,您可以简单地使用
data.allKeys
data.allNames
来访问数据源方法中这些数组的相应元素

class ChoiceListTableViewController: UITableViewController {
    var data:TableViewSelectable.Type! // make sure that this is actually initialized before accessing it

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.allKeys.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath)
        cell.textLabel?.text = data.allNames[indexPath.row]
        return cell
    }
}

你做了一些事情,但不知道从哪里开始-那么你到底为什么想要一个接受enum作为数据源的表视图?@mag_zbc因为我需要一个通用的表视图,我可以从任何地方启动,并使用不同的enum作为数据源初始化它所以,可以添加一些示例说明如何实现表视图数据源方法吗?这正是我所需要的。谢谢!:)