Swift扩展
Swift中的「扩展」(extensions)和OC中的categories类似,只是Swift中的「扩展」没有名字。Swift中的「扩展」可以向一个已有的类/结构体/枚举类型添加新功能,这包括在没有权限获取源代码的情况下扩展类型的能力(即逆向建模)。Swift中的「扩展」可以:
- 添加计算型实例属性和计算型类型属性;
- 定义实例方法和类型方法;
- 提供新的构造器;
- 定义下标(subscripts);
- 定义和使用嵌套类型;
- 使已有类型遵守某个协议;
值得一提的是,和OC中的categories一样,Swift中的extensions不可以添加存储型属性;它可以为已有类型添加方法/计算型属性/下标/构造器,但是不能override已有的方法/计算型属性/下标/构造器;
Extensions语法
使用关键字extension
声明一个扩展,如下:
extension SomeType {
// new functionality to add to SomeType goes here
}
一个extension可以扩展一个已有类型,使其能够适配一个或多个协议。此时,接口的名字应该完全按照类或结构体的名字的方式进行书写:
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
扩展计算型属性
extension可以向已有类型添加「计算型实例属性」和「计算型类型属性」。下面的例子向Swift的内置Double
类型添加5个计算型实例属性,从而提供与距离单位协作的基本支持,如下:
extension Double {
var km: Double { return self * 1_000. }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000. }
var ft: Double { return self / 3.28084 }
} let oneInch = 25.4.mm
println("One inch is \(oneInch) meters")
// prints "One inch is 0.0254 meters"
let threeFeet = .ft
println("Three feet is \(threeFeet) meters")
// prints "Three feet is 0.914399970739201 meters"
P.S:25.4.mm
有种现实物理应用的感觉,屌爆了!
注意:extension可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(即didSet和willSet代码块)。
扩展构造器
extension可以向已有类型添加新的构造器。这可以让你扩展其他类型,将你自己的定制类型作为构造器参数,或者提供该类型的额外初始化选项(而这些额外处理在原始实现中并没有被包含)。
值得一提的是,如果你使用扩展提供了一个新的构造器,你依旧有责任保证构造过程能够让所有实例完全初始化。
扩展方法
extension可以向已有类型添加新的实例方法和类型方法。下面的例子向Int
类型添加一个名为repetitions的新实例方法:
extension Int {
func repetitions(task: () -> ()) {
for _ in ..<self {
task()
}
}
}
定义该扩展之后,你就可以对任意整数调用repetitions方法,实现的功能则是多次执行某任
务:
.repetitions({
println("Hello!")
})
// Hello!
// Hello!
// Hello!
可以使用trailing闭包使调用更加简洁:
.repetitions {
println("Goodbye!")
}
// Goodbye!
// Goodbye!
// Goodbye!
上述针对Int
的扩展方法属于immutable方法,其实也可以扩展mutable方法,在定义式中加上一个mutating
关键字修饰即可。
扩展下标
extension可以向一个已有类型添加新下标。下面栗子向Swift内置类型Int
添加了一个整型下标。该下标[n]
返回十进制数字从右向左数的第n个数字:
[]返回9
[]返回8
代码实现如下:
extension Int {
subscript(var digitIndex: Int) -> Int {
var decimalBase =
while digitIndex > {
decimalBase *=
--digitIndex
}
return self / decimalBase %
}
}
[]
// returns 5
[]
// returns 9
[]
// returns 2
[]
// returns 7
Swift扩展的更多相关文章
- Swift扩展(Extension)
在现有类和结构体的类型基础上,扩展新的功能. 语法: extension SomeType{ // new functionality to add to SomeType goes here } A ...
- Swift—扩展声明-备
声明扩展的语法格式如下: extension 类型名 { //添加新功能 } 声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包括类.结构体和枚举,但是我们仍然可以扩展整型. ...
- 【iOS】Swift扩展extension和协议protocol
加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...
- Swift 扩展
前言 扩展就是给一个现存类.结构体.枚举或者协议添加新的属性或者方法,无需修改目标的源代码,就可以把想要的代码加到目标上面. 扩展可以用来扩展现有类型的计算属性.构造器.方法和下标. 不能添加一个已经 ...
- iOS: 学习笔记, swift扩展
// // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All right ...
- [Swift]扩展String类:Base64的编码和解码
扩展方式1: extension String { //Base64编码 func encodBase64() -> String? { if let data = self.data(usin ...
- [Swift]扩展UIImage :获取图片指定像素的颜色值
对[UIImage]进行扩展 import UIKit extension UIImage{ /** 根据坐标获取图片中的像素颜色值 */ subscript (x: Int, y: Int) -&g ...
- [Swift]扩展UIColor:实现十六进制颜色字符串与UIColor之间的相互转换
对[UIColor]进行扩展 import UIKit extension UIColor { // Hex String -> UIColor convenience init(hexStri ...
- [Swift]扩展String类:extension String
请参考本博客另一篇技术博文: <[Swift]字符串(String类.NSString类)常用操作> extension String { //获取字符串首字符 var first: St ...
随机推荐
- Codeforces初体验
Codeforces印象 这两天抽时间去codeforces体验了一把. 首先,果然有众多大牛存在.非常多名人一直參加每周一次的比赛.积分2000+,并參与出题. 另外.上面题目非常多.预计至少一千题 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- A20 Gate信号
https://doc.docsou.com/ba8e6b0612d6a989b7cebeaae-5.html Gate A20 Option 功能:设置A20 地址线的控制模式 设定值:Fast 或 ...
- python--面向对象—接口
开放封闭原则依赖导致原则接口隔离原则继承多态抽象类和接口类 编程思想:为子类做规范 归一化设计:几个类都实现了相同的方法 抽象类:最好单继承,且可以简单的实现功能 接口类:可以多继承,且最好不实 ...
- SpringMVC学习(一):搭建SpringMVC-注解-非注解
文章参考:http://www.cnblogs.com/Sinte-Beuve/p/5730553.html 一.环境搭建: 目录结构: 引用的JAR包: 如果是Maven搭建的话pom.xml配置依 ...
- 调用Camera返回为空的分析及处理方法
前言 大家可能遇到了这种情况.调用Camera,然后指定自己定义的保存路径,结果返回的Intent为空.我们来分析一下原因. 分析 首先看Camera的部分逻辑,在源代码中的Camera.java的d ...
- 一套Tomcat处理多个域名请求 - Virtual Host
最近和Tomcat较上劲了... 作为Tomcat的系列之一,来尝试下如何用一套Tomcat来处理多个域名请求. 场景:基于成本考虑,多个department共用一台服务器,然后该服务器上就一套Tom ...
- 深入Garbage First垃圾收集器(一)术语
Garbage垃圾收集器的原理,在这篇博客中有讲到,可以拿来参考下, Getting Started with the G1 Garbage Collector(译) 另外在这篇博客中也有讲到很多垃圾 ...
- MySQL-怎样使update操作sleep一段时间
)) a on mytest.id=a.id set mytest.name='xiaowang';
- 28个jQuery性能优化的建议
我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可 ...