关于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