扩展Extension
- 扩展支持为现有类型增加功能(可没有源代码),支持一下类型:
- 类
- 结构
- 枚举
- 协议
- 除了不能增加实例存储属性和析构器外,使用扩展可以增加:
- 计算属性(实例属性和类型属性)
- 类型存储属性
- 方法(实例方法和类型方法)
- 初始化器
- 下标
- 为类型实现协议
- 内嵌类型
class Shape{
func process(){
print("Shape.process")
}
}
class Rectangle:Shape{
var x:Int
var y:Int
var length:Int
var width:Int
init(x:Int,y:Int,length:Int,width:Int){
self.x=x
self.y=y
self.length=length
self.width=width
}
}
extension Rectangle{
//var z=0
static var max=100
/*
deinit{
}*/
/*override func process(){
print("extension Rectangle process")
}*/
var area: Int{
return self.length*self.width;
}
convenience init(x1:Int, y1:Int, x2:Int, y2:int){
let l=abs(x2-x1)
let w=abs(y2-y1)
self.init(x:x1,y:y1,length:l,width:w)
}
func moveTo(x:Int, _ y:Int){
self.x=x
self.y=y
}
}
var r=Renctangle(x1:1,y1:1,x2:10,y2:10)
print(Rectangle.max++)
print(r.area)
r.moveTo(3,3)
struct Point{
var x=0
var y=0
}
extension Point{
mutating func moveTo(x:Int, _ y:Int){
self.x=x
self.y=y
}
}
var p=Point()
p.moveTo(100,200)
extension String{
func draw(){
print(self)
}
}
var str="Hello,Swift"
str.draw()
//定义协议
protocol Drawable{
var discription: String{
get
}
func draw()
}
//扩展实现协议
extension Rectangle: Drawable{
var discription: String{
return "[x=\(x),y=\(y),length=\(length),width=\(width)]"
}
func draw(){
print(self.discription)
}
func erase(){
print("Rectangle.erase")
}
//提供自己的实现
/*
func encode(){
print("Rectangle.encode")
} */
}
r.draw()
//扩展协议类型
extension Drawable{
//默认实现
func encode(){
print("Drawable.encode")
print(self.discription)
}
}
r.encode()
var text:String
var array:Array<Int>
var table:Dictonary<String,Int>
var data:Int
使用扩展的注意点
- 扩展不可以增加实例存储属性,但可以增加类型存储属性。换言之,扩展不能更改实例对象的内存模型。
- 扩展只能增加便捷初始化器,不能增加指定初始化器。
- 扩展中可以添加新的方法,但不可以override基类方法。
- 结构和枚举的扩展,若果实例方法更改self,需要声明mutating
协议与扩展
- 扩展实现协议:在为类型实现扩展是,增加实现某些协议。
- 实现过程中必须实现协议的所有成员
- 也可以添加实现非协议的成员
- 扩展协议类型:可以扩展协议来提供发发和属性的默认实现。
- 协议扩展内的成员都必须提供默认实现,可以调用原协议内的成员
- 所有遵守协议的类型自动继承这些默认实现,但可以提供自己独特的实现
- 扩展协议时,也可以添加where子句约束
使用扩展的建议
-
使用场景
- 适合在没有源代码的情况下,向已经封装的类中添加方法或属性。
- 为一个类在某些特殊场景下增加功能。
- 对于复杂的大型文件分割实现。
-
添加扩展
- 自己创建的类
- 系统的类
- 第三方库