美文网首页
类型扩展

类型扩展

作者: 霏誠拜咬o | 来源:发表于2016-07-12 17:58 被阅读0次

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

    使用扩展的建议

    • 使用场景

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

      • 自己创建的类
      • 系统的类
      • 第三方库

    相关文章

      网友评论

          本文标题:类型扩展

          本文链接:https://www.haomeiwen.com/subject/uexsjttx.html