Swift 扩展(Extension)总结
概要
扩展是给已经存在的类(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)总结的更多相关文章
- 【iOS】Swift扩展extension和协议protocol
加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...
- Swift语言精要 - 扩展(Extension)
swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { } func multiplyWith(ano ...
- Objective-C分类 (category)和扩展(Extension)
1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...
- Swift 使用Extension 场景 浅析
别人一看到我的 Swift 代码,立刻就会问我为什么如此频繁的使用 extension.这是前几天在我写的另一篇文章中收到的评论: 我大量使用 extension 的主要目的是为了提高代码可读性.以下 ...
- Objective-C语法之扩展(Extension)的使用
Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法: ...
- Objective-C 类别(category)和扩展(Extension)
1.类别(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...
- [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 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 ...
- 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别
1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...
随机推荐
- JIRA 破解文件研究(Win 7环境)
最近再次回来研究 Win 7 下的 JIRA,按网上的很多方法去尝试,竟然无法正常安装! 经过几次的弯路尝试,终究还是成功了. 嗯,有必要总结一下: 发觉网上的很多破解方法都太老!不管是什么原因,在6 ...
- monkey无规则压力测试
例:monkey -p com.tencent.mtaexample -s 23 --throttle 100 --ignore-crashes --ignore-timeouts -v -v -v ...
- HDU - 6113 2017百度之星初赛A 度度熊的01世界
度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...
- ZOJ2898【折半搜索】
题意: 给出一系列值和对应的陷阱,对于陷阱如果存在两个就抵消,求价值最大. 思路: 折半枚举,利用异或 #include <bits/stdc++.h> using namespace s ...
- PHP json 对象 数组互相转换
json格式转为数组/对象 json_decode() json 对象/数组转json格式 json_encode()
- 3DMAX 多维材质及对应的UVW展开,UVW贴图
多维材质说明 多维材质就是一个模型多个材质,(混合材质是多个材质混一起,跟这个貌似没关,比如地表草地,泥土等的混合操作) 作用: 比如一个模型就是需要两种材质,刀的金属刀身,木质刀柄,墙的一面是木板, ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- 平衡的阵容 st表学习
模板 预处理 void rmq_isit() { ;i<=n;i++) mx[i][]=mn[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)- ...
- 「BZOJ2127」happiness(最小割)
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- Python序列化模块pickle和json使用和区别
这是用于序列化的两个模块: • json: 用于字符串和python数据类型间进行转换 • pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:d ...