首页 > 代码库 > 奔五的人学IOS:Swift中的protocol及其应用实例

奔五的人学IOS:Swift中的protocol及其应用实例

最近在学习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 UIKit

class 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方法中处理取到的数据就可以了。

奔五的人学IOS:Swift中的protocol及其应用实例