美文网首页
表驱动法在iOS中的应用

表驱动法在iOS中的应用

作者: weithl | 来源:发表于2017-02-09 13:40 被阅读115次

表驱动法(Table-Driven Methods)出自《代码大全》。它是一种编程模式——从表里面查找信息而不使用逻辑语句。

表提供了一种负责的逻辑和继承结构的替换方案。如果你发现自己对某个应用程序的逻辑或继承树关系感到困惑,那么问问自己它是否可以通过一个查询表来加以简化。

在实际使用中,我们常常在cellForRow中写上了很多的逻辑判断语句。在大多数情况下,可以通过表驱动法更便捷地达到目的。

最简单的例子:
初学 iOS 时,想必大家都写过下面类似的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier")! 
        if indexPath.row == 0 {
            cell.textLabel?.text = "title0"
        } else if indexPath.row == 1 {
            cell.textLabel?.text = "title1"
        } else if indexPath.row == 2 {
            cell.textLabel?.text = "title2"
        }

    return cell
}

根据表驱动法的思路,可以用以下方式替代:

var contents: [String] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        contents = ["title0", "title1", "title2"]
    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier")!
        let title = contents[indexPath.row]
        cell.textLabel?.text = title

    return cell
}

当然,实际情况不可能这么简单。比如要创建一个简单的设置界面,这个时候contents可以包含字典以设置cell属性。
例如:

var contents:[[String: Any]] = []
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellid")
        
    for x in 0 ..< 3 {
       let dict = [
            "id" : "cellid",
            "title" : "title" + String(x),
            "detail" : "detail" + String(x),
            "height" : 44.0
        ] as [String : Any]
        contents.append(dict)
    }
    
}


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

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let dict = contents[indexPath.row] as [String : Any]
    let height = dict["height"] as? Double
    return CGFloat(height!)
    
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellid")!
    
    let dict = contents[indexPath.row] as [String : Any]
    let title = dict["title"] as? String

    cell.textLabel?.text = title
    
    return cell
}

这个时候就不需要同时在 cellForRow heightForRow 进行判断去设置属性了。

进一步,可以将上例中的字典替存储在本地文件(json或者plist,二者没有明显的性能差距)。简单的json文件示例:

{
     "applyInfo" : [
        {
            "header" : "",
            "height" : 0.0001,
            "footer" : "",
            "footerHeight" : 20,
            "content" : [
                {
                    "title" : "借款编号",
                    "height" : 50,
                    "detail" : "",
                    "id" : "someID"
                },
                {
                    "title" : "产品类型",
                    "height" : 50,
                    "detail" : "",
                    "id" : "someID"
                }
            ]
        },
        {
            "header" : "",
            "height" : 50,
            "footer" : "",
            "footerHeight" : 0.0001,
            "content" : [
                {
                    "title" : "姓名",
                    "height" : 50,
                    "detail" : "",
                    "id" : "someID"
                },
                {
                    "title" : "性别",
                    "height" : 50,
                    "detail" : "",
                    "id" : "someID"
                },
            ]
        },
    ]
}

每次取出时,转换成cellModel对象。如果有多个Section,再增加一层sectionModel
通过这种方式,封装成一个基类FormController。结合ReactiveCocoadidSelectRow的代码写在cellForRow里,可以方便的写出复杂的填表页面。

具体代码,大家可以参考 Form

相关文章

  • 表驱动法在iOS中的应用

    表驱动法(Table-Driven Methods)出自《代码大全》。它是一种编程模式——从表里面查找信息而不使用...

  • 微习惯养成第二天——读代码大全18章 表驱动法

    第18章 表驱动法 18.1 表驱动法使用总则(General considerations in using t...

  • 表驱动法

    表驱动法:表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。事...

  • 代码规范 : 表驱动法(远离if switch)

    表驱动法的准则 使用表驱动法的关注的两个核心问题: 1 怎样从表中查询条目的问题; 2 应该在表里面存什么两个核心...

  • 表驱动法

    Table-Driven Approach表驱动法 表驱动法,用查表的方法获取数值 我们平时查字典以及念初中时查《...

  • 表驱动法

    简书 賈小強转载请注明原创出处,谢谢! 表驱动法是一种编程模式(scheme)--从表里面查找信息而不使用逻辑语句...

  • 表驱动法

    第一层大括号匿名内部类第二层动态语句块

  • 表驱动法

    阶梯访问表 用两个数组0-59 分是不及格 F级60- 79 是及格 E级80-84 是普通 D级85-89 是良...

  • iOS表驱动法去除if-else简化逻辑

    今天介绍用表驱动法优化代码中的逻辑 去除复杂繁多的if-else判断 WMZStrategy(demo) 所谓表...

  • UITableView和UITableViewCell

    一:UITableViewUITableView表视图。表示图在我们日常的iOS开发中应用非常广泛。descrip...

网友评论

      本文标题:表驱动法在iOS中的应用

      本文链接:https://www.haomeiwen.com/subject/uuviittx.html