美文网首页
Swift编程最佳体验之Generic + Protocol +

Swift编程最佳体验之Generic + Protocol +

作者: JustLee__ | 来源:发表于2017-05-09 21:15 被阅读119次

    关于Swift代码风格,能让绝大部分人的眼前一亮,WTF?还能这样写?今天就带来一段Swift常见的Generic + Protocol + Extension基础代码。
    知识点介绍:
    1.Generic,泛型便是拥有共同特性的类型的代表,定义特定的泛型去书写代码,免去了很多不必要的事情。
    2.Protocol,不做很多解释,你遵守我的协议就要帮我去做规定的事情。
    3.Extension,为我们的日常代码模块化提供了很大的便利,让代码拓展更加轻松。

    今天用这种方式实现UITableView方法做一些封装。

    比如这样的代码:

    let cellIdentifier = "cellIdentifier"
    let cell = tableView.dequeueReusableCell(withReuseIdentifier: cellIdentifier)
    

    长此以往,你或许已经厌倦了这种方式。

    今天的学习便是为此而开展的,Go!

    在Swift中,可以给Extension去实现一些底层的代码,那么就意味着我们不用每次必须遵守协议、实现协议,因为你可以在Class的扩展中让它自己去实现。Excuse me?他自己都实现了,要我们何用?答案一会就知道。

    1.首先声明一个协议,并利用自身的拓展去实现这个协议
    protocol Reusable {
        /// 为cell准备的Identifier
        static var just_Idnentifier: String { get }
    }
    extension Reusable {
        /// 利用自己的扩展实现自己
        static var just_Idnentifier: String {
            return String(describing: self)
        }
    }
    
    2.然后让UITableViewCell遵守上面的协议
    // MARK: - 遵守这个协议,且什么都不用操作,我们便有了just_Identifier这个属性
    extension UITableViewCell: Reusable { }
    
    3.准备工作到这里就结束了,接下来我们将用到泛型Generic,我们用一个UITableView的扩展去添加一些方法
    extension UITableView {
        func just_dequeueReusableCell<T: UITableViewCell>(_: T.Type) -> T where T: Reusable {
            guard let cell = self.dequeueReusableCell(withIdentifier: T.just_Idnentifier) as? T else {
                fatalError("Could not dequeue cell with identifier: \(T.just_Idnentifier)")
            }
            return cell
        }
        func just_registerNib<T: UITableViewCell>(_: T.Type) {
            register(UINib(nibName: T.just_Idnentifier, bundle: nil), forCellReuseIdentifier: T.just_Idnentifier)
        }
    }
    
    最后:接下来让咱们去看一下使用
        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.just_registerNib(DemoCell.self)
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.just_dequeueReusableCell(DemoCell.self)
            cell.textLabel?.text = "Swift 最佳编程体验之 \(indexPath.row)"
            return cell
        }
    

    这种方式是不是清爽了不少,且代码更不容易出错,逼格也上去了,所以还等什么呢?

    最后附上Demo

    相关文章

      网友评论

          本文标题:Swift编程最佳体验之Generic + Protocol +

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