奔五的人學IOS:Swift中的protocol及其應用執行個體,iosswift
最近在學習ios抓取網頁內容時遇到各種重複代碼的問題,看著這麼多重複的代碼,感覺實在不爽,於是學習了ios的protocol。
在我看來這個protocol其實應該是Java中的interface。
也就是定義一個協議(或者叫介面),定義一堆方法,讓實現了該方法的類的執行個體傳入即可。
在我的工程中,抓取不同網頁的viewcontroller,擷取網頁的代碼完全是一模一樣的,除了網址不同以外,別無二致,所以這一部分提取出來作為一個類,專門實現上網取資料,資料取到了需要通知viewcontroller,這時就需要一個回調,這裡就用protocol來達到這個目的。
先來定義一個protocol
@objc protocol callBack : NSObjectProtocol { func success(data:String) optional func error(error: NSError)}
這裡的 protocol就叫 callBack,裡面定義了兩個方法,其中一個是可選的。
再來定義一個類實現抓取網頁
class NetUtil :NSObject, NSURLConnectionDelegate,NSURLConnectionDataDelegate{ var cb :callBack? init(url:String,cb:callBack) { super.init() self.cb = cb let req : NSURLRequest = NSURLRequest(URL: NSURL(string: url)!) let conn : NSURLConnection = NSURLConnection(request: req, delegate: self)! } var data : NSMutableData! var tableData: NSArray = NSArray() func connection(connection: NSURLConnection, didReceiveData data: NSData) { self.data.appendData(data); } func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) { self.data = NSMutableData(); } func connectionDidFinishLoading(connection: NSURLConnection) { let s = NSString(data: data, encoding: NSUTF8StringEncoding) cb?.success(s!) } func connection(connection: NSURLConnection, didFailWithError error: NSError) { cb?.error?(error) }}
我把它叫網路工具吧,由於使用了NSURLConnection來取資料,所以同樣這個類需要實現NSURLConnection的兩個協議,然後在相應的方法中調用callBack的方法以便通知主程式完成相應的工作。
在成功後調用cb.success(),出錯後調用cb.error()。
這些都準備好後,再回到相應的viewcontroller中來實現這個callBack協議,並實現調用。
//// ViewController.swift// 測試工程//// Created by 周蜜 on 14/11/26.// Copyright (c) 2014年 www.miw.cn. All rights reserved.//import UIKitclass ViewController: UIViewController,callBack{ override func viewDidLoad() { super.viewDidLoad() var url :String! = "http://www.miw.cn/info/csdn/cloud/1/list" //在這裡調用我的網路工具,將self作為實現了協議callBack的參數 NetUtil(url: url, cb: self) } @IBOutlet weak var appsTableView: UITableView! override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } //這裡實現callBack中的必要方法 func success(data: String) { println(data) } }
現在看起來我的主程式是不是簡單多了?
在對應的success方法中處理取到的資料就可以了。