扩展是为一个已经存在的类、结构、枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能。

扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名字。

扩展能够为已存在类型:

1)增加计算属性和计算静态属性;

2)定义新的实例方法和类型方法;

3)提供新的初始化方法;

4)定义新的下标方法;

5)定义和使用新的嵌套类型;

6)使其符合某个协议

使用扩展为已存在类型添加的新功能,对于该类型的所有实例都可用,包括那些在扩展创建之前就已经创建的实例。

1.1 扩展语法

使用extension关键字来声明一个扩展:

extensionSomeType
{

// new functionality to add to SomeType goes here

}

1.2 扩展的使用

1)、 添加计算属性

如下例子展示了通过扩展Swift语言内建的Double类型,为其添加几个只读的计算实例属性使其具有了长度单位转换功能。

extension Double {

var km:Double
{return self *1_000.0
}

var m:Double
{return self }

var cm:Double
{return self /100.0
}

var mm:Double
{return self /1_000.0
}

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 =3.ft

println("Three feet is\(threeFeet)
meters”)

扩展不能添加存储属性或者为已存在的属性添加属性观察者。

2)、 添加初始化方法

扩展能为已有类型增加新的初始化方法。

扩展能为一个已有类增加新的便利初始化方法,但不能为其增加新的指派初始化方法或析构。

如果你使用扩展为一个没有定义任何定制初始化方法的值类型增加一个为它的所有的存储属性提供默认值的初始化方法 ,你能在扩展中定义的这个初始化方法中调用Swift语言为其提供的默认初始化方法或者成员逐一初始化方法。下面的例子使用扩展为一个Rect结构提供了额外的初始化方法:

struct Size {

var width
=0.0,height =0.0

}

struct Point {

var x
=0.0,y =0.0

}

struct Rect {

var origin
=Point()

var size
=Size()

}

extension Rect
{

init(center:Point,size:Size)
{

let originX
=center.x - (size.width
/ 2)

let originY
=center.y - (size.height
/ 2)

self.init(origin:Point(x:originX,y:originY),size:size)

}

}

该扩展中定义的初始化方法调用了原结构中已有的由Swift提供的成员逐一初始化方法。

3)、 方法的添加

扩展也能为已有类型增加新的实例方法和类型方法。下例为Swift的内嵌类型Int类型增加了一个新的实例方法repetitions。

extension Int
{

func repetitions(task:
() -> ()) {

task()

}

}

增加的实例方法repetitions方法带有一个没有输入参数和返回值的函数参数,因此你可以在任意一个整数上使用闭合作为参数调用该方法,  如下所示:

3.repetitions({

println("Hello!")

})

// Hello!

由于使用闭合作为方法的参数,因此还可以简化为:

3.repetitions {

println("Goodbye!")

}

// Goodbye!

用一个扩展增加的实例方法也能够修改实例自身及其属性,与方法的变异类似,要修改一个结构和枚举的self属性或者修改它的其它属性,扩展的实例方法必须使用mutating关键字来标记。

如下的例子用来扩展Swift语言的内嵌整数类型(Int),该扩展为Int类型增加了一个新的变异方法square。quare内部能够修改self属性(实现求本身数的倍数),因此该方法被标记为mutating。

extension Int {

mutating fund square()
{

self =self
*self

}

}

var someInt =3

someInt.square()

// someInt is now 9

4)、下标方法的添加

扩展也能为已有类型增加新的下标方法,如下展示了一个为Swift语言内建的整数类型添加一个下标方法的例子。该例子实现某个整数的下标[] ,下标n[n]返回该整数的从右开始的第n位置,如下所示:

extension Int {

subscript(digitIndex:Int)
->Int {

var decimalBase
=1

for_in 1...digitIndex
{

decimalBase *=10

}

return (self
/decimalBase) %10

}

}

746381295[0]

// returns 5

5)  添加嵌套类型

扩展也能为已有类型(类、扩展、枚举)增加新的嵌套类型,如下例子所示:

extensionCharacter
{

enum Kind
{

case Vowel,Consonant,Other

}

var kind:Kind
{

switch String(self).lowercaseString
{

case "a","e","i","o","u":

return .Vowel

case "b","c","d","f","g","h","j","k","l","m",

"n","p","q","r","s","t","v","w","x","y","z":

return .Consonant

default:

return .Other

}

}

}

本例使用扩展为Swift语言内建的Character类型增加了一个内嵌类型Kind,并使用该类型返回呈现特定字符的字母的类型。

版权所有,请转载时清楚注明链接和出处,谢谢!


苹果新的编程语言 Swift 语言进阶(十四)--扩展的更多相关文章

  1. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

  2. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  3. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  4. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  5. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  6. 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

    Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...

  7. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...

  8. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

  9. 苹果新的编程语言 Swift 语言进阶(十)--类的继承

    一.类的继承 类能够从其它类继承方法.属性以及其它特性,当一个类从另外的类继承时,继承的类称为子类,它继承的类称为超类.在Swift中,继承是类区别与其它类型(结构.枚举)的基础行为. 1.1 .类的 ...

随机推荐

  1. 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。

    给定整数a1.a2.a3.....an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8). 分析:此题相对于本节"寻找满 ...

  2. Android简易实战教程--第二十五话《网络图片查看器》

    访问网络已经有了很成熟的框架.这一篇只是介绍一下HttpURLConnection的简单用法,以及里面的"注意点".这一篇可以复习或者学习HttpURLConnection.han ...

  3. VS2008界面语言设置

    在卸载某个软件的时候,不知道什么原因导致vs2008的界面变成中文的了,但是菜单还是英文的,很不美观. 几经查找,最后可以在如下的地方设置界面语言 Tools -> Options 如果设置成 ...

  4. 仿qq最新侧滑菜单

    为了后续对这个项目进行优化,比如透明度动画.背景图的位移动画,以及性能上的优化. 我把这个项目上传到github上面,请大家随时关注. github地址https://github.com/sungu ...

  5. Linux的sleep()和usleep()

    1.sleep和usleep都是linux中的程序挂起函数.只是时间的单位不一样. 2. sleep的基本单位是s(秒),也可以用m(分).h(小时). 例: sleep 1 : 挂起1秒 sleep ...

  6. expect 简单使用

    简单的登陆脚本 这样就不用每次都输入ssh命令了,使用密码还是有些不安全,谨慎使用. #!/usr/bin/expect -f #filename: auto_login.sh #author: or ...

  7. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  8. Android5.1设备无法识别exFAT文件系统的64G TF卡问题

    64G TF卡刚买回来的时候默认exFAT文件系统,在电脑端(XP和WIN7)可以识别,但在我们Android5.1S设备无法识别,采用guiformat工具格式化为FAT32文件系统后才可以正常识别 ...

  9. J2EE学习从菜鸟变大鸟之五 JDBC(Java Data Base Connectivity)

    JDBC刚开始学习这个的时候看到了,以为是ODBC呢,很是相似啊,总的来说还是基本上一类的东东,但是还有一些细微的区别,下面和大家一起分享学习. JDBC(Java Data Base Connect ...

  10. XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容

    一.新建Demo2类: import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXPar ...