關于Swift代碼風格,能讓絕大部分人的眼前一亮峦阁,WTF耘成?還能這樣寫榔昔?今天就帶來一段Swift常見的Generic + Protocol + Extension基礎代碼凿跳。
知識點介紹:
1.Generic,泛型便是擁有共同特性的類型的代表控嗜,定義特定的泛型去書寫代碼,免去了很多不必要的事情疆栏。
2.Protocol,不做很多解釋珠洗,你遵守我的協(xié)議就要幫我去做規(guī)定的事情。
3.Extension许蓖,為我們的日常代碼模塊化提供了很大的便利,讓代碼拓展更加輕松膊爪。
今天用這種方式實現(xiàn)UITableView方法做一些封裝。
比如這樣的代碼:
let cellIdentifier = "cellIdentifier"
let cell = tableView.dequeueReusableCell(withReuseIdentifier: cellIdentifier)
長此以往沛豌,你或許已經(jīng)厭倦了這種方式赃额。
今天的學習便是為此而開展的加派,Go跳芳!
在Swift中,可以給Extension去實現(xiàn)一些底層的代碼飞盆,那么就意味著我們不用每次必須遵守協(xié)議、實現(xiàn)協(xié)議桨啃,因為你可以在Class的擴展中讓它自己去實現(xiàn)。Excuse me匈棘?他自己都實現(xiàn)了,要我們何用主卫?答案一會就知道鹃愤。
1.首先聲明一個協(xié)議,并利用自身的拓展去實現(xiàn)這個協(xié)議
protocol Reusable {
/// 為cell準備的Identifier
static var just_Idnentifier: String { get }
}
extension Reusable {
/// 利用自己的擴展實現(xiàn)自己
static var just_Idnentifier: String {
return String(describing: self)
}
}
2.然后讓UITableViewCell遵守上面的協(xié)議
// MARK: - 遵守這個協(xié)議瘩将,且什么都不用操作凹耙,我們便有了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)
}
}
最后:接下來讓咱們?nèi)タ匆幌率褂?/h5>
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
}
這種方式是不是清爽了不少,且代碼更不容易出錯提佣,逼格也上去了吮蛹,所以還等什么呢拌屏?
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