教你做一款可以賺錢的iPhone APP》28
阿新 • • 發佈:2018-12-16
第2部分 故事的進階要素 - 程式語言Swift的進階部分
16 委託 16.1 概念通俗講解 委託是一種設計模式,它使類或結構體通過協議能夠將其某些職責委託給另一個類或結構體,讓另一個類或結構體幫它實現。 例如兒子想要開車出門做不到,需要爸爸(這裡假設爸爸會開車)幫忙。此時,兒子通過協議建立一個委託,通過委託告訴爸爸需要開車出門(具體開車的方法不需要告知爸爸,只需要告知爸爸開車出門即可)。然後爸爸接受這個委託,具體的去做開車出門這個事情。
16.2 定義簡潔介紹 舉例說明委託的流程
class Son{
//第1步,兒子需要開車出門
func driveCar (){
//第2步,兒子不會開車
//兒子此時需要建立一個委託,找爸爸幫忙(假設爸爸會開車)
print("請求爸爸幫忙")
//第5步,通過協議建立好委託後,呼叫協議的方法
help?.dadHelp()
}
//第4步,建立協議型別的屬性
var help: NeedDadHelp?
}
//第3步,建立協議,委託爸爸幫忙
protocol NeedDadHelp {
func dadHelp()
}
//第6步,爸爸收到兒子需要幫忙的委託請求,遵守協議NeedDadHelp
class Dad: NeedDadHelp{
//第7步,爸爸實現協議的dadHelp()方法,開車出門
func dadHelp() {
print("開車出門")
}
}
//第8步,建立雙方例項
let son = Son()
let dad = Dad()
//第9步,建立連線,爸爸遵守NeedDadHelp協議,下面這句爸爸和兒子建立了連線,當兒子委託爸爸幫忙時,可以找到爸爸。
son. help = dad
//第10步,呼叫兒子的driveCar()方法可以找到爸爸的dadHelp()方法,從而最終實現委託爸爸開車出門這個事情
son.driveCar()
再舉一個實際開發中經常用的例子,和上面的邏輯是類似的。 注:下面的程式碼是摘抄,執行不起來。另外諸如UIScrollView,UIButton,UIViewController等知識會在後面講解
//類HomeView
class HomeView: UIScrollView{
//類HomeView中有一個按鈕
let button = UIButton()
func buttonTarget(){
//按鈕觸控觸發事件,觸發函式是buttonClick
button.addTarget(self, action: #selector(buttonClick), for: .touchUpInside)
}
//第1步,點選按鈕實現頁面跳轉
@objc func buttonClick(button:UIButton){
//第2步,點選按鈕需要實現如下功能
// let listController = ListViewController()
// listController.name = name
// self.navigationController?.pushViewController(listController, animated: true)
//但是HomeView繼承的是UIScrollView,不能使用self.navigationController?.pushViewController(listController, animated: true)
//這個方法需要繼承UIViewController的類才能實現。
//這時就需要找委託幫忙了
//第5步,通過協議建立好委託後,呼叫協議的方法
if let homeViewDelegate = homeViewDelegate{
if let title = button.title(for: .normal){
homeViewDelegate.homeViewDelegateButton(name: title)
}
}
}
//第4步,建立協議型別的屬性
var homeViewDelegate:HomeViewDelegate?
}
//第3步,建立協議,委託HomeViewController類幫忙
protocol HomeViewDelegate {
//定義的這個方法裡就是想實現HomeView類按鈕觸發事件的邏輯
func homeViewDelegateButton(name:String)
}
//第6步,HomeViewController收到HomeView需要幫忙的委託請求,遵守協議HomeViewDelegate
class HomeViewController: UIViewController, HomeViewDelegate{
override func viewDidLoad() {
super.viewDidLoad()
//第8步,建立雙方例項
var homeView:HomeView? = HomeView()
//第9步,建立連線
//homeViewDelegateButton傳到HomeView類裡去
homeView?.homeViewDelegate = self
//第10步,當用戶點選HomeView類的buttonClick()方法時,可以找到HomeViewController類的homeViewDelegateButton()方法
if let homeView = homeView{
//HomeView不是繼承UIViewController類,要把它載入到HomeViewController上(HomeViewController是繼承UIViewController的),才能呼叫button.addTarget事件
self.view.addSubview(homeView)
homeView.buttonTarget()
}
}
//第7步,實現協議的方法具體邏輯
func homeViewDelegateButton(name:String){
let listController = ListViewController()
listController.name = name
self.navigationController?.pushViewController(listController, animated: true)
}
}
16.3 我的經驗總結 類A有個方法實現不了,委託類B幫忙實現的流程總結: 第1步,首先建立一個協議,定義想要實現的方法。 第2步,類A定義一個協議例項,通過例項呼叫協議方法。 第3步,類B遵守協議,實現協議方法具體邏輯。 第4步,實現類A和類B的例項,雙方建立連線。 第5步,當呼叫類A的協議方法時,類B裡的協議方法可以響應。
注:本人水平和能力有限,如果哪些地方寫錯了,請大家給我反饋,我會及時修改。