奔五的人學IOS:Swift中的protocol及其應用執行個體,iosswift

來源:互聯網
上載者:User

奔五的人學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方法中處理取到的資料就可以了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.