使用Swift的代理,閉包來封裝一個公用協(xié)議減少垃圾代碼

iOS開發(fā)中,如果不進行適當?shù)姆庋b,使用協(xié)議或者繼承類來進行開發(fā),你就會遇到傳說中的ViewController(以后簡稱VC) Hell的問題……

比如說,我們先聲網App中為了調用接口,做簡單的判斷,會有如下的垃圾代碼(前輩遺留下來的):

override func viewDidLoad() {
    super.viewDidLoad()
    
    var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1)
    self.navigationController?.navigationBar.barTintColor = color
    
    self.httpController.delegate = self
    
    Config.shareInstance().isNetworkRunning = CheckNetwork.doesExistenceNetwork()
    
    if Config.UUID == nil || Config.UUID!.isEmpty
    {
        Tool.showErrorHUD("去信息門戶登錄一下吧:)")
    }
    else if !Config.shareInstance().isNetworkRunning
    {
        Tool.showErrorHUD("貌似你沒有聯(lián)網哦")
    }
    else
    {
        Tool.showProgressHUD("正在更新校園網信息")
        sendNicAPI()
    }
    // Do any additional setup after loading the view.
}

func sendNicAPI(){
    let nicURL = "http://herald.seu.edu.cn/api/nic"
    let parameter:NSDictionary = ["uuid":Config.UUID!]
    
    self.httpController.postToURLAF(nicURL, parameter: parameter, tag: "nic")
}

func didReceiveDicResults(results: NSDictionary, tag: String) {
    if let content:NSDictionary = results["content"] as? NSDictionary{
        if tag == "nic"{
            firstSend = false
            Tool.showSuccessHUD("獲取信息成功")
            println(content.allKeys)
        }
    }
}

看到了嗎,每個VC開頭都得這樣寫一發(fā),如果我們有20多個功能呢?會變成什么樣子?

坑爹的功能列表

所以,這樣下去是絕對不行的,必須對整個亂七八糟的初始化,發(fā)送請求,請求接受進行封裝,這里就會用到Swift最有用的協(xié)議,代理,以及閉包了。

這個首先通過協(xié)議和代理,閉包放在下一篇。

協(xié)議,顧名思義,也就是其他語言里面的接口(C++的抽象類也差不多)
由于Swift不支持普通類型(Int之流)設置為Static,類方法如果是靜態(tài),必須加class關鍵字(我覺得這個很有槽點),只有Struct和Enum可以直接用Static(也有小Tip可以用Struct包裹一個普通類型,設為計算類型,然后充當一個Static成員,但是這里不講了)

我們首先可以這樣封裝簡單的初始化方法……

class func initNavigationAPI(VC:UIViewController,navBarColor:UIColor) -> HttpController?{
    var httpController:HttpController = HttpController()
    VC.navigationController?.navigationBar.barTintColor = navBarColor
    
    Config.shareInstance().isNetworkRunning = CheckNetwork.doesExistenceNetwork()
    
    if Config.UUID == nil || Config.UUID!.isEmpty{
        Tool.showSuccessHUD("請在邊欄的個人資料中補全您的信息")
    }
    else if !Config.shareInstance().isNetworkRunning{
        Tool.showErrorHUD("貌似你沒有聯(lián)網哦")
    }
    else{
        Tool.showProgressHUD("正在獲取信息")
        return httpController
    }
    return nil
}

OK?那個HttpController是另一個接口,來進行網絡操作的,代理需要靠它,所以我們返回一個HttpController實例,如果失敗就返回nil,在實際VC里面加一個解包判斷即可。

以后,想要初始化,就只需要這樣了

override func viewDidLoad() {
    super.viewDidLoad()
    var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1)
    self.httpController = Tool.initNavigationAPI(self,navBarColor: color) ?? nil
    
    if (self.httpController != nil){
        self.httpController!.delegate = self
        Tool.sendAPI("cardDetail", httpController: self.httpController!)
    }
}

把一群亂七八糟的代碼扔走。下一步就是如果用代理來代理我們所有的請求以及相應的結果了,下一篇文章補上……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容