美文网首页
类型扩展

类型扩展

作者: 霏誠拜咬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子句约束

使用扩展的建议

  • 使用场景

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

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

相关文章

  • Kotlin入门(五):扩展属性,函数(笔记)

    Kotlin中可以扩展原始类型的函数和属性,原始类型称为“接受类型”. 扩展函数 在接收类型上添加扩展函数,语法如...

  • 类型扩展

    扩展Extension 扩展支持为现有类型增加功能(可没有源代码),支持一下类型:类结构枚举协议 除了不能增加实例...

  • Swift中的扩展

    扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。 1. 扩展语法 可以通过扩展来扩展一个已有类型,...

  • Extension(扩展)

    // 扩展 extension// 扩展就是为一个已有的类,结构体,枚举类型或者协议类型添加新功能。“扩展和 Ob...

  • Java的基本数据类型(Primitive Types)

    Java数据类型分为内置类型和扩展类型两大类,其中的内置类型就是基本数据类型,而扩展类型则是Java语言根据基本类...

  • 数据类型扩展

    1、整数类型扩展-----进制 例如: 2、浮点数类型扩展-----银行业务表示 钱 float double ...

  • Swift 扩展

    ⚠️ 扩展可以向类型添加新功能,但不能覆盖现有功能。 ✨✨ 扩展属性 ✨✨ 扩展计算属性 ✨✨ 扩展构造方法 ✨✨...

  • 数值类型扩展

    数值类型扩展 支持二进制和八进制二进制用 0b 或 0B 开头, 八进制用 0o 或 0O 开头: 新加 Numb...

  • 数值类型扩展

    数组的扩展 Array, from()将类数组对象和可遍历对象转化为真正的数组。 和它类似的是扩展运算符, 一样可...

  • 【iOS开发】Swift便利构造函数

    扩展可以向已有类型添加新的构造器。这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实...

网友评论

      本文标题:类型扩展

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