奔五の人学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と呼ばれ、2つの方法が定義されています.そのうちの1つはオプションです.
クラスを定義してWebページをキャプチャ
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の2つのプロトコルを実装し、対応するメソッドで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メソッドで処理すればよい.