概要

扩展是给已经存在的类(class),结构体(structure),枚举类型(enumeration)和协议(protocol)增加新的功能。类似Objective-C中的Category,不同的是,Extension没有名字。扩展可以做以下事情:

  • 增加计算实例属性和计算类型属性
  • 定义实例方法和类型方法
  • 提供新的初始化器
  • 定义下标
  • 定义和使用新的内置类型
  • 让一个存在的类型服从一个协议

注:扩展可以增加新的功能,但是不能覆盖已有的功能

扩展的语法

使用extension关键字,如下所示。

extension SomeType{
//new functionality to add to SomeType goes here
} extension SomeType: SomeProtocol, AnotherProtocol{
//implementation of protocol requirements goes here
}

注意:如果你给已经存在的类型扩展了新的功能,不管你在什么时候扩展,尽管你是在实例定义之后再扩展的,那么这个类型所有的实例都可以使用这个新功能,

计算属性

扩展可以给已经存在的类型增加计算实例属性和计算类型属性,如以下扩展了Double类型:

extension Double{

   var km : Double { return self * 1000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
var ft: Double { return self / 3.28084 }
} let oneInch = 25.4.mm;
print("One inch is \(oneInch)meters")

构造方法(Initializers)

可以扩展一个类型实现自定义构造方法,但是只能增加便利构造方法(Convenience Initializers),不能增加指定构造方法(Designated Initializers)。

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()
}

Rect结构体没有自定义的构造方法,因为其属性都有初始值,所以系统提供了一个默认构造方法和逐一成员构造方法,在增加构造方法时,可以调用逐一成员构造方法。要确保类型中所有的存储属性都有初始值。

extension Rect{

   init(center: Point, size: Size) {
let originX = center.x - (size.width / )
let originY = center.y - (size.height / )
self.init(origin: Point(x: originX, y: originY), size: size)
} }

方法

扩展可以增加实例方法和类型方法,如下所示。

extension Int{

   funcrepetitions(task: () -> Void) {
for _ in ..<self {
task()
}
}
} .repetitions { //尾随闭包
print("hello")
}

可变实例方法(Mutating Instance Methods)

扩展增加的实例方法可以修改实例本身。结构体和枚举类型中的方法如果想要修改实例本身或者属性的话需要用mutating来修饰方法,所以扩展这样的方法也需要加mutating

extension Int{

   mutating func square() {
self = self * self
print(self)
} } var someInt =
someInt.square()

下标

扩展可以给存在的类型增加新的下标,如下的例子:

extension Int{

   subscript(digitIndex: Int) -> Int {
var decimalBase =
for _ in ..<digitIndex {
decimalBase *=
}
return(self/ decimalBase) %
} } [] // returns 5
[] // returns 9
[] // returns 2
[] // returns 7

内置类型

扩展可以给存在的类、结构体和枚举类型增加新的内置类型。

extension Int{
enumKind {
casenegative, zero, positive
} var kind: Kind {
switch self {
case :
return .zero
case let x where x > :
return .positive
default:
return .negative
}
} } func printIntegerKinds(_numbers: [Int]) {
for number in numbers {
switch number.kind {
case .negative:
print("-", terminator: "")
case .zero:
print("", terminator: "")
case .positive:
print("+", terminator: "")
}
}
print("")
} printIntegerKinds([, , -, , -, , ]) // Prints "+ + - 0 - 0 +

作者:泗哥
链接:https://www.jianshu.com/p/edf4cad8dfd5
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Swift 扩展(Extension)总结的更多相关文章

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

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

  2. Swift语言精要 - 扩展(Extension)

    swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { } func multiplyWith(ano ...

  3. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  4. Swift 使用Extension 场景 浅析

    别人一看到我的 Swift 代码,立刻就会问我为什么如此频繁的使用 extension.这是前几天在我写的另一篇文章中收到的评论: 我大量使用 extension 的主要目的是为了提高代码可读性.以下 ...

  5. Objective-C语法之扩展(Extension)的使用

    Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法: ...

  6. Objective-C 类别(category)和扩展(Extension)

    1.类别(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  7. [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Swift protocol extension method is called instead of method implemented in subclass

    Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...

  9. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

随机推荐

  1. Linux运行Tomcat下的war文件

    1.查看Tomcat进程: ps -ef |grep tomcat 2.关闭Tomcat进程: kill -9 pid 3.关闭Tomcat运行: bin目录下执行 ./shutdown.sh 4. ...

  2. wxGlade的图标,原来是来自蒙德里安的名画!

    一直用wxGlade做GUI的,今天突然发现它的图标和一副油画很像. wxGlade的图标,图标的文件名竟然就叫做mondrian.ico 蒙德里安创造了很多这种纯粹的基本要素的作品,下面是其中之一, ...

  3. WCF部署到IIS上调用报错:由于扩展配置问题而无法提供您请求的页面

    将WCF部署到全新win7 x64 IIS7.5上访问报错:由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 原因:IIS不识别.sv ...

  4. SQL中的drop,truncate和delete的区别

    (1)   DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...

  5. NativeScript官方书籍:1.为什么选择nativescript

    1.为什么选择nativescript 本章介绍 什么是NativeScript nativescript对于移动开发世界意味着什么 NativeScript工作原理 在早期的移动应用程序(前iPho ...

  6. CF 148D D Bag of mice (概率dp)

    题目链接 D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Go语言入门——数组、切片和映射

    按照以往开一些专题的风格,第一篇一般都是“从HelloWorld开始” 但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了. ...

  8. OVN学习(二)

    部署OVN实验环境 同OVN学习(一) L3网络 创建逻辑交换机和路由 ### Central节点 ### 创建逻辑交换机和路由器 # ovn-nbctl ls-add inside # ovn-nb ...

  9. js混杂笔记

    1.判断对象为空的方法 1)Object.keys({}).length === 0 // true 2)Object.getOwnPropertyNames({}).length === 0 // ...

  10. org.apache.commons.httpclient.HttpClient的使用(转)

    HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提供了访 ...