swift 枚举在tableview上的用法

假如有一个账号信息页面,布局如下。。你该如何设置你的数据源呢,以及该如何处理你的tableview的点击代理呢???


Simulator Screen Shot 2016年8月4日 下午12.48.18.png

以往,也就是大部分的数据源问题我就不列出来了。。。
我写下大部分人的点击代理的写法

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        switch indexPath.section {
        case 0:
            switch indexPath.row {
            case 0:
                print("头像")
            case 1:
                print("用户名")
            case 2:
                print("ID")
            case 3:
                print("等级")
            case 4:
                print("vip")
            default:
                print("密码")
            }
        case 1:
            print("身份证")
        case 2:
            print("银行")
        case 3:
            print("qq")
        case 4:
            print("淘宝")
        default:
            print("京东")
        }
    }

上面这个写法很正确。。。。没有什么可以说的。但是你就不觉得代码很难看吗???
而且你还要去看看数据源中对应的是哪个???比如,你还得看看等级是在那个section,哪个row
假如说第2个分区有3个row呢,第三个分区有5个row呢。。。。那你这个方法里全是switch case 了,嵌套在嵌套,累不累

你累不累啊。。。你就不想换个其它思路,其它写法???

开工~~~啥都不说了,上代码

首先定义一个枚举


/**
 账号信息页面枚举
 
 - Icon:     头像
 - Name:     用户名
 - ID:       ID
 - Level:    用户等级
 - Vip:      我的Vip
 - Password: 用户密码
 - Card:     身份证信息
 - Bank:     银行卡
 - QQ:       QQ号
 - TB:       淘宝
 - JD:       京东
 */
enum AccountMenu: Int {
    case Icon = 0, Name, ID, Level, Vip, Password, Card, Bank, QQ, TB, JD
}

//这里我设置的枚举类型是Int,当然你也可以根据需求设置其它类型
Swift
枚举中支持以下四种关联值类型:
整型(Integer)
浮点数(Float Point)
字符串(String)
布尔类型(Boolean)

然后为这个枚举写个扩展

extension AccountMenu {
    /// 信息页面菜单的信息(标题----图像----下一个控制器)
    var menuInfo: (title: String, icon: UIImage?, nextControl: UIViewController?) {
        get {
            switch self {
            case .Icon:
                return ("头像", ACCOUNT_ICON, nil)
            case .Name:
                return ("用户名", ACCOUNT_NAME, nil)
            case .ID:
                return ("ID", ACCOUNT_ID, nil)
            case .Level:
                return ("用户等级", ACCOUNT_LEVLE, nil)
            case .Vip:
                return ("我的vip", ACCOUNT_VIP, nil)
            case .Password:
                return ("用户密码", ACCOUNT_PWD, nil)
            case .Card:
                return ("身份证信息", ACCOUNT_CARD, nil)
            case .Bank:
                return ("银行卡", ACCOUNT_BANK, nil)
            case .QQ:
                return ("QQ号", ACCOUNT_QQ, UIViewController())
            case .TB:
                return ("淘宝", ACCOUNT_TB, nil)
            case .JD:
                return ("京东", ACCOUNT_JD, nil)
            }
        }
        set {
            
        }
    }
}

尽管增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。

然后在viewModel里面设置数据源

struct AccountViewModel {
    
    /// 数据源---[key: [(数组(AccountMenu))]]
    private let dataSource: [String: [AccountMenu]] = ["0": [.Icon, .Name, .ID, .Level, .Vip, .Password], "1": [.Card], "2": [.Bank], "3": [.QQ], "4": [.TB], "5": [.JD]]
}

我敢保证这个数据源,比绝大部分人的数据源要好看些。。。。。

后面的就是处理了。。。。我就直接上代码了

extension AccountViewModel {
    func numberOfSections() -> Int {
        return dataSource.count
    }
    
    func numberOfRowsInSection(section: Int) -> Int {
        guard let count = dataSource["\(section)"]?.count else {
            return 0
        }
        return count
    }
    
    func cellForRowAtIndexPath(indexPath: NSIndexPath, atTableView tableView: UITableView) -> UITableViewCell {
        let identifier = "accountRootCell"
        var cell = tableView.dequeueReusableCellWithIdentifier(identifier)
        if cell == nil {
            cell = UITableViewCell(style: .Value1, reuseIdentifier: identifier)
        }
        cell?.separatorInset = UIEdgeInsetsZero
        if let sectionArr = dataSource["\(indexPath.section)"] {
            cell?.imageView?.image = sectionArr[indexPath.row].menuInfo.icon
            cell?.textLabel?.text = sectionArr[indexPath.row].menuInfo.title
        }
        return cell!
    }
    

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        guard let sectionArr = dataSource["\(indexPath.section)"],
            let nextVC = sectionArr[indexPath.row].menuInfo.nextControl else {
                return
        }
        nextVC.hidesBottomBarWhenPushed = true
        control.navigationController?.pushViewController(nextVC, animated: true)
    }
}

当然如果你要处理点击事件。。你也可以按照下面这个写法

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        guard let sectionArr = dataSource["\(indexPath.section)"] else {
            return
        }
        let type = sectionArr[indexPath.row]
        print(type)
        //如果你想做其他动作---可以直接按照下面这个来了
        switch type {
        case .Icon:
            print("icon")
        case .Name:
            print("name")
        case .ID:
            print("id")
        case .Level:
            print("level")
        case .Vip:
            print("vip")
        case .Password:
            print("pwd")
        case .Card:
            print("card")
        case .Bank:
            print("bank")
        case .QQ:
            print("qq")
        case .TB:
            print("tb")
        case .JD:
            print("jd")
        }
    }

在这里。。。你就不用按照indexPath来区分了,而是直接来按照枚举类型来做的。。。。代码是比最上面那个方法多,但是你不觉得这代码写的很好看吗????

当然swift的枚举还有其它更NB的用法。。这里我暂时还没有搞明白,等过段时间再写swift枚举的其它用法吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,123评论 4 61
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI下拉刷新模糊效果A...
    袁俊亮技术博客阅读 11,937评论 9 105
  • 七零后,小公务员一名,为了敦促自己少说,多做,不与时代脱节。过好每一天,做一个富裕、健康、快乐的人。始终想想自己的...
    白菜2017A阅读 427评论 2 4
  • 我们总期望找到一种固定的模式,以简化对世界的判断和处理。然后,现实却不断啪啪打脸,阅读是一项需要刻意练习的技能和手...
    中年惡爸阅读 2,880评论 0 0
  • 爱 阿馨 多在花前停留吧 哪怕片刻的时间 也许,一转身便是永远 爱在每个夜晚 回看那条小路 和那独树一帜的别墅 你...
    诗意的栖居_b130阅读 353评论 0 1