Swift的protocol与协议扩展
2016-05-03 17:28
459 查看
⭐️苹果为什么将Swift 2.0称为面向协议的语言(Protocol-Oriented Programming):
⭐️协议这个概念在Objective-C中就存在了。所谓协议其实就是一系列可以调用方法的结合。在我们调用的时候就可以将注意力集中在方法本身而不是类的实现。苹果在swift 2.0里面给protocol赋予了更加强大的功能。protocol能够被直接扩展。这样prototol的使用更加灵活方便了。
⭐️应用场景:
1、基于protocol可以被直接扩展的特性,我们可以很方便的实现一些经常被复用的代码。比如上传事件到一些数据分析平台上去。我这里用google analytics作为例子。
那么我们就能在遵循了协议的地方直接使用logEvent(“category”, action:”action”)
2、有人会说这样的修改并没有给我们开发带来多大的便利。那么下面这个特性才是protocol的核心了。
我们的程序会有很多popup的信息,错误信息,版本提示信息等等等等。这时候我们不得不在每个需要用到的viewcontroller中都实现一遍。想不重复代码? 可以! 要么我们写一个UIViewController的基类。要么将viewController作为参数传进函数中。
这是在UIViewController中加的协议,表明只要继承自UIViewController的类,都可以使用协议扩展中的方法,所以我们就可以在任何VC中logEvent了
⭐️协议这个概念在Objective-C中就存在了。所谓协议其实就是一系列可以调用方法的结合。在我们调用的时候就可以将注意力集中在方法本身而不是类的实现。苹果在swift 2.0里面给protocol赋予了更加强大的功能。protocol能够被直接扩展。这样prototol的使用更加灵活方便了。
⭐️应用场景:
1、基于protocol可以被直接扩展的特性,我们可以很方便的实现一些经常被复用的代码。比如上传事件到一些数据分析平台上去。我这里用google analytics作为例子。
//定义protocol protocol MTLog { func logEvent(category: String, action: String, label: String?, value: NSNumber?) }
// 扩展protocol extension MTLog { func logEvent(category: String, action: String, label: String? = nil, value: NSNumber? = nil ) { //Google analytics code let tracker = GAI.sharedInstance().defaultTracker let builder = GAIDictionaryBuilder.createEventWithCategory(category, action: action, label: Label, value: Value) tracker.send(builder.build() as [NSObject : AnyObject]) } }
那么我们就能在遵循了协议的地方直接使用logEvent(“category”, action:”action”)
2、有人会说这样的修改并没有给我们开发带来多大的便利。那么下面这个特性才是protocol的核心了。
我们的程序会有很多popup的信息,错误信息,版本提示信息等等等等。这时候我们不得不在每个需要用到的viewcontroller中都实现一遍。想不重复代码? 可以! 要么我们写一个UIViewController的基类。要么将viewController作为参数传进函数中。
extension MTLog where Self: UIViewController { func errorHandle(error: String) { let alertController = UIAlertController(title: nil, message: error, preferredStyle: .Alert) let cancelAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil) alertController.addAction(cancelAction) self.presentViewController(alertController, animated: true, completion: nil) } }
这是在UIViewController中加的协议,表明只要继承自UIViewController的类,都可以使用协议扩展中的方法,所以我们就可以在任何VC中logEvent了
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- 介绍 Fedora 上的 Swift
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- C#、ASP.NET通用扩展工具类之LogicSugar
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发