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

时间: 2024-10-25 12:14:31

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

奔五的人学IOS:swift练手与csdn,近期学习总结

早在五月份就准备开始学习ios开发,当时还是oc,学习了几天,最终不得其法,到了ios8开放,再加swift的出现,从10月份开始,终于找到了一些技巧,学习起来还算略有心得. 今天把我在学习swift的过程中的一个小程序与大家分享. 本应用主要实现csdn的资讯阅读与分享,取名为csdn头条. 涉及技术: 1.xcode的使用 2.UITableViewController 3.StoryBoard 4.页面跳转与参数传递 5.TableViewCell的自适应高度 6.TableViewCel

奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法

swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String { func has(v:String)->Bool { return self.componentsSeparatedByString(v).count > 1 } }

奔五的人学ios:swift居然没有字符串包含,找个简单的解决方法

swift关于字符串的判断中 有前导,有后缀 两个方法,居然没有包含判断. 经过学习找了个简单的解决方法: extension String { func has(v:String)->Bool { return self.componentsSeparatedByString(v).count > 1 } }

奔五的人学iOS:用swift实现获取拼音首字母,支持取一句话中每字拼音首字母

在最近一项目中,遇到获取拼音首字母的问题,查找了一下网上的方法,没有找到合适好用的,于是自己研究了一下,写了以下方法,欢迎交流,希望对各位有帮助. // // PYFirst.swift // 获取拼音首字母,支持取一句话中每字拼音首字母 // Created by 周蜜([email protected]) on 2015/6/1(儿童节). // Copyright (c) 2015年 www.miw.cn. All rights reserved. // import Foundation

奔五的人学iOS:通知所有界面更新

好久没写东西了,今天来留个笔记. 毕竟没能全面了解iOS的工作机制,匆忙用工程来练手,有些比较简单的问题,解决起来还是走了些弯路. 在我的工程中,有后台工作的代码,后台工作完成后需要通知前台所有页面刷新,最初我使用自定义的protocol来处理,理论上是可行的,我将所有需要更新的界面都实现该刷新协议,然后将该界面实例添加进一个数组,在需要更新界面时遍历该数组,挨个通知. protocol MiRefresh{ func refresh() } var list = [MiRefresh]() /

奔五的人学IOS:一个好的应用最终还是要由服务端来支撑其功能,兼谈几个免费云空间

学习ios-swift有一段时间了,一些基本控件的使用应该是没有问题了.但一个好的应用最终还是要由服务端来支撑其功能,为了练习各种控件的使用,想找网站上现有的api并且内容又是你想要的,可能性很小,如果是已经有了该api,那一定是已经有了相应的app了. 基于以上原因,想要练习app,那就先弄api吧. 首先就从csdn入手了,考虑弄一个csdn的资讯app,直接抓取csdn的页面吧?这个思路有考虑过,但这个需要由swift来解析页面内容,感觉需要一定的功能才行,查了一下swift还没有类似的解

iOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系

类(class):具有相同属性和行为等同一类元素等总称,类是一个抽象的概念. 区分是类还是对象,看它能否继续被细分. 在OC中,类是表示对象类型的结构体,对象通过类来获取自身的各种信息.类由两个部分组成:*.h和*.m文件组成. *.m文件中 implemention部分是类的实现部分,内部包含类中的各种信息,包括各种实例方法或类方法. 类别( category):是为现有的类添加新方法的方式,通常以"类名称+类别名称"来命名. 类别中不能添加新的实例变量.但是可以在类别中添加属性.

swift 中使用OC第三方库(以AFNetworking为例)

首先呢  把你需要的第三方库导入到你的项目中来  具体怎么导入 这不是这篇的重点  看上一篇 废话不多  直接上 (1)在项目中直接建一个 oc 的控制器  然后xcode会提醒你  要不要建造桥接文件  选择创建就OK了  看下图最下面  是我创建的 (2)确定使用那个桥接头文件 如下图 (3)在桥接文件里  直接这样写  如下图 (4)然后你就可以在你的项目中使用你添加的库了  就是这么简单 下面来看一下 我在swift中使用的AFNetworking 的实例代码  请求的是百度首页的数据

在Swift中,如何像Objective-C定义可选接口?

Objective-C中的protocol里存在@optional关键字,被这个关键字修饰的方法并非必须要被实现.我们可以通过接口定义一系列方法,然后由实现接口的类选择性地实现其中几个方法.在Cocoa API中很多情况下接口方法都是可选的,这点和Swift中的protocol的所有方法都必须被实现这一特性完全不同. 那些如果没有实现则接口就无法正常工作的方法一般是必须的,而相对地像作为事件通知或者对非关键属性进行配置的方法一般都是可选的.最好的例子我想应该是UITableViewDataSou