类型扩展

扩展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子句约束

使用扩展的建议

  • 使用场景

    • 适合在没有源代码的情况下,向已经封装的类中添加方法或属性。
    • 为一个类在某些特殊场景下增加功能。
    • 对于复杂的大型文件分割实现。
  • 添加扩展

    • 自己创建的类
    • 系统的类
    • 第三方库
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容