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扩展的更多相关文章

  1. Swift扩展(Extension)

    在现有类和结构体的类型基础上,扩展新的功能. 语法: extension SomeType{ // new functionality to add to SomeType goes here } A ...

  2. Swift—扩展声明-备

    声明扩展的语法格式如下: extension 类型名 { //添加新功能 } 声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包括类.结构体和枚举,但是我们仍然可以扩展整型. ...

  3. 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...

  4. Swift 扩展

    前言 扩展就是给一个现存类.结构体.枚举或者协议添加新的属性或者方法,无需修改目标的源代码,就可以把想要的代码加到目标上面. 扩展可以用来扩展现有类型的计算属性.构造器.方法和下标. 不能添加一个已经 ...

  5. iOS: 学习笔记, swift扩展

    // // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All right ...

  6. [Swift]扩展String类:Base64的编码和解码

    扩展方式1: extension String { //Base64编码 func encodBase64() -> String? { if let data = self.data(usin ...

  7. [Swift]扩展UIImage :获取图片指定像素的颜色值

    对[UIImage]进行扩展 import UIKit extension UIImage{ /** 根据坐标获取图片中的像素颜色值 */ subscript (x: Int, y: Int) -&g ...

  8. [Swift]扩展UIColor:实现十六进制颜色字符串与UIColor之间的相互转换

    对[UIColor]进行扩展 import UIKit extension UIColor { // Hex String -> UIColor convenience init(hexStri ...

  9. [Swift]扩展String类:extension String

    请参考本博客另一篇技术博文: <[Swift]字符串(String类.NSString类)常用操作> extension String { //获取字符串首字符 var first: St ...

随机推荐

  1. android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方案

    最近实在受不了eclipse的“迟钝”,准备入手Android studio开发环境,但是貌似不太顺利,成功安装了Android studio,在线更新Android adk的时候,总是遇到如下错误: ...

  2. 自己写的通过ADO操作mysql数据库

    #include <iostream> #include <windows.h> #include <atlstr.h> #import "c:\Prog ...

  3. hibernate的注解装配

    1.多对多,(中间表不用映射) @ManyToMany @JoinTable(name = "中间表名", joinColumns = { @JoinColumn(name = & ...

  4. python(28)- 面向对象练习Ⅱ

    题目一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 类内定义的函数,不经装饰器装饰,被实例化对象调用,会默认传入一个self参数,对象将会传递给self: 定义方式比较 ...

  5. Ffmpeg 实现文件切割

    文件切割是一项很常见的基本功能,通过Ffmpeg可以很容易实现这项功能. 首先介绍下基本原理,文件切割说白了就过滤掉文件的部分音视频包,按照什么规则过滤呢? 答案是时间戳.文件中每个视频及音频包都有时 ...

  6. Spring.net1.3.1+Nhibernate3.0+Mysql/Access/SqlServer/Oracel/SQlite

    详情请看我的博文:http://www.ruisoftcn.com/blog/article.asp?id=999

  7. 函数指针使用演示样例(參考Linux-内核代码)

    本文有xhz1234(徐洪志)编写,转载请注明出处. http://blog.csdn.net/xhz1234/article/details/36635083 作者:徐洪志 近期阅读Linux-内核 ...

  8. Spring Boot中使用RSocket

    1. 概述 RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket用在spring boot中, ...

  9. 2015最新iherb海淘攻略-图文入门教程-6月免邮

    注:仅仅有首次下单才享有新人优惠10$,大家下单之后千万不要取消后.否则之后则不享有新人优惠. 注:眼下Sino-海淘客国际物流已取消,仅有UCS合众速递. IHerb是美国最热门的海淘海购网站之中的 ...

  10. IOS 单元测试

    本文转载至 http://blog.csdn.net/fengsh998/article/details/8109293 IOS 自带单元测试. 1.在创建时,将include Unit Tests钩 ...